工程名以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函数中按顺序写绘图函数即可。
可能出现的问题:
XX模块对于SAFESEH 映像是不安全的。
解决方法:
1.打开该项目的“属性页”对话框。
2.单击“链接器”文件夹。
3.单击“命令行”属性页。
4.将 /SAFESEH:NO 键入“其他选项”框中,然后点击应用。
参考自https://blog.csdn.net/m0_37876745/article/details/78150209