工程名以XXX为例:
1. 给VS配置OpenGL的dll/lib/h等,这里略。
2. 在stdafx.h中添加
//包含 OpenGL 头文件
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glaux.h>
#include<GL/glut.h>
3. 设置项目-项目名-属性-常规-字符集:使用多字节字符集
4. 对CXXXView添加WM_CREATE、WM_DESTROY、WM_SIZE的消息响应函数,暂时不编辑代码。
5. 在CXXXView.h中添加:
public:
HGLRC m_hGLRC; //OpenGL 绘制描述表
CDC* m_pDC; //OpenGL 设备描述表
HPALETTE m_hPalette; //OpenGL 调色板
protected:
BOOL RenderScene(void);
BOOL SetupPixelFormat(void);
void SetLogicalPalette(void);
6. 在CXXXView.cpp中
public:
HGLRC m_hGLRC; //OpenGL 绘制描述表
CDC* m_pDC; //OpenGL 设备描述表
HPALETTE m_hPalette; //OpenGL 调色板
protected:
BOOL RenderScene(void);
BOOL SetupPixelFormat(void);
void SetLogicalPalette(void);
7. 编辑响应函数代码
Oncreate()内添加:
//初始化 OpenGL
m_pDC = newCClientDC(this);
if(!SetupPixelFormat())
return -1;
m_hGLRC =wglCreateContext(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(),m_hGLRC);
return 0;
Onsize()内添加:
//添加窗口缩放是的视口变换
glViewport(0,0,cx,cy);
OnDestroy()内添加:
//删除调色板、渲染上下文
::wglMakeCurrent(NULL,NULL);
::wglDeleteContext(m_hGLRC);
if(m_hPalette)
DeleteObject(m_hPalette);
if(m_pDC)
delete m_pDC;
8. 添加pfd设置。
在CXXXView.cpp中添加:
BOOLCXXXView::SetupPixelFormat(void) {
PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // pfd 结构的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER, // 双缓存模式
PFD_TYPE_RGBA, // RGBA 颜色模式
24, // 24 位颜色深度
0,0, 0, 0, 0, 0, // 忽略颜色位
0, // 没有非透明度缓存
0, // 忽略移位位
0, // 无累加缓存
0,0, 0, 0, // 忽略累加位
32, // 32 位深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0,0, 0 // 忽略层,可见性和损毁掩模
};
int iPixelFormat; // 为设备描述表得到匹配的像素格式
if((iPixelFormat =ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0)
{
MessageBox("ChoosePixelFormat Failed", NULL, MB_OK);
returnFALSE;
} // 设置匹配的像素格式为当前的像素格式
if(SetPixelFormat(m_pDC->GetSafeHdc(),iPixelFormat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat Failed", NULL, MB_OK);
returnFALSE;
}
if(pfd.dwFlags & PFD_NEED_PALETTE)
SetLogicalPalette();//设置逻辑调色板
returnTRUE;
}
voidCXXXView::SetLogicalPalette(void) {
struct { WORD Version;
WORDNumberOfEntries;
PALETTEENTRY aEntries[256]; }
logicalPalette= { 0x300, 256 };
BYTE reds[] = { 0, 36,72, 109, 145, 182, 218, 255 };
BYTE greens[] = { 0, 36,72, 109, 145, 182, 218, 255 };
BYTE blues[] = { 0, 85,170, 255 };
for (int colorNum = 0;colorNum<256; ++colorNum)
{
logicalPalette.aEntries[colorNum].peRed= reds[colorNum & 0x07];
logicalPalette.aEntries[colorNum].peGreen= greens[(colorNum >> 0x03) & 0x07];
logicalPalette.aEntries[colorNum].peBlue= blues[(colorNum >> 0x06) & 0x03];
logicalPalette.aEntries[colorNum].peFlags= 0;
}
m_hPalette= CreatePalette((LOGPALETTE*)&logicalPalette);
}
按如上步骤框架搭建完后,应该能成功运行一个空白的程序。证明代码没错。
之后想要绘图,在自己建立的RenderScene函数中按顺序写绘图函数即可。
BOOL CXXXView::RenderScene(void) {
//调用 OpenGL 绘图函数进行图形绘制
//根据需要自行修改,也可在派生类中重载此函数
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
glPushMatrix();
//在这里进行绘图
glPopMatrix();
glFlush();
SwapBuffers(m_pDC->GetSafeHdc());
return TRUE;
}
可能出现的问题:
XX模块对于SAFESEH 映像是不安全的。
解决方法:
1.打开该项目的“属性页”对话框。
2.单击“链接器”文件夹。
3.单击“命令行”属性页。
4.将 /SAFESEH:NO 键入“其他选项”框中,然后点击应用。
参考自https://blog.youkuaiyun.com/m0_37876745/article/details/78150209