基于MFC的OPENGL绘图框架搭建
2009-10-22 16:26
459 查看
1、修改PreCreateWindow:
2、修改OnDraw:
3、添加消息WM_CREATE处理函数:
4、添加消息WM_DESTROY处理函数:
5、添加消息WM_SIZE处理函数:
6、设置逻辑调色板:
7、设置像素格式:
8、初始化OPENGL场景:
9、编写绘图程序:
That's OK!!!
BOOL CMy2dClusterView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 //////////////////////////////////////////////////////////////// //设置窗口类型 cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS; //////////////////////////////////////////////////////////////// return CView::PreCreateWindow(cs); }
2、修改OnDraw:
void CMy2dClusterView::OnDraw(CDC* pDC) { //Display(); CMy2dClusterDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 ////////////////////////////////////////////////////////////////// ::glPushMatrix(); RenderScene(); //渲染场景 ::glPopMatrix(); ////////////////////////////////////////////////////////////////// ::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区 }
3、添加消息WM_CREATE处理函数:
int CMy2dClusterView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 ////////////////////////////////////////////////////////////////// //初始化OpenGL m_pDC = new CClientDC(this); InitializeOpenGL(m_pDC); ////////////////////////////////////////////////////////////////// return 0; }
4、添加消息WM_DESTROY处理函数:
void CMy2dClusterView::OnDestroy() { CView::OnDestroy(); // TODO: 在此处添加消息处理程序代码 ///////////////////////////////////////////////////////////////// //删除调色板和渲染上下文、定时器 ::wglMakeCurrent(0,0); ::wglDeleteContext(m_hRC); if(m_hPalette) DeleteObject(m_hPalette); if(m_pDC) delete m_pDC; ///////////////////////////////////////////////////////////////// }
5、添加消息WM_SIZE处理函数:
void CMy2dClusterView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 ///////////////////////////////////////////////////////////////// //添加窗口缩放时的图形变换函数 if (0 >= cx || 0 >= cy) return; currentWidth = cx; currentHeight = cy; glViewport(0, 0, cx, cy); ///////////////////////////////////////////////////////////////// }
6、设置逻辑调色板:
///////////////////////////////////////////////////////////////////// // 设置逻辑调色板 ////////////////////////////////////////////////////////////////////// void CMy2dClusterView::SetLogicalPalette() { struct { WORD Version; WORD NumberOfEntries; 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); }
7、设置像素格式:
////////////////////////////////////////////////////////// // 设置像素格式 ////////////////////////////////////////////////////////// BOOL CMy2dClusterView::SetupPixelFormat() { 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 pixelformat; pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式 ::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式 if(pfd.dwFlags & PFD_NEED_PALETTE) SetLogicalPalette(); //设置逻辑调色板 return TRUE; }
8、初始化OPENGL场景:
////////////////////////////////////////////////////////// // 初始化openGL场景 ////////////////////////////////////////////////////////// BOOL CMy2dClusterView::InitializeOpenGL(CDC *pDC) { m_pDC = pDC; SetupPixelFormat(); //生成绘制描述表 m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc()); //置当前绘制描述表 ::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC); return TRUE; }
9、编写绘图程序:
BOOL CMy2dClusterView::RenderScene() { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //add own code here return TRUE; }
That's OK!!!
相关文章推荐
- MFC单文档程序中搭建OpenGL框架 .
- 绘图对话框基于MFC对话框的OpenGL三维图形开发
- 基于MFC的OpenGL绘图
- 转载:基于MFC的OpenGL绘图
- 基于MFC完整的OpenGL框架步骤
- 基于MFC的OpenGL绘图
- MFC单文档程序中搭建OpenGL框架
- MFC环境下搭建OpenGL框架并进行数据文件读取以及模型绘制的注意事项
- 基于MFC的OpenGL 绘图例程
- opengl 基于MFC的OpenGL绘图原理
- 基于MFC单文档SDI的OpenGL图形程序的基本框架
- 搭建OpenGL的MFC框架
- Phinecos(洞庭散人) 专注于开源技术的研究与应用 基于MFC的OpenGL绘图
- 基于MFC的OpenGL 绘图例程
- 基于MFC的对话框Dialog的OpenGL程序框架
- 基于MFC的OpenGL绘图(转)
- 基于MFC的OpenGL绘图
- VC环境下基于MFC框架的OpenGL的编程环境的配置
- VC环境下基于MFC框架的OpenGL的编程环境的配置
- 在MFC单文档的对话框中进行opengl绘图的框架!