MFC的对话框中使用OpenGL绘图
来源:互联网 发布:python cmdb开发实例 编辑:程序博客网 时间:2024/05/16 07:48
我们在编写软件是总是会有自己的界面,当然利用C++就不得不和MFC打交道了,那么可视化界面通常就要用MFC的Dialog;OpenGL通常画图时会自己生成一个窗口,就如同OpenCV一样,但现在我想OpenGL把图画在对话框指定的位置上,列如,我想在以下对话框的左侧部分显示我要画的图,该怎么做呢?
接写来我将分享一点我的实现:
1、首先当然要设置好OpenGL的编程环境;
2、新建一个基于对话框的工程,我选择VS studio平台;
3、选着Project->add->class,添加一个新类,取名为MyOpenGL,选着基类为CWnd
4利用VS的类向导给MyOpenGL添加OnCreate()和OnPaint()函数;
5、在MyOpenGL.h中添加成员变量
- class MyOpenGL :
- public CWnd
- {
- public:
- MyOpenGL(void);
- ~MyOpenGL(void);
- //////////////////////////////////////////////////////////////////////////
- //成员变量
- int MySetPixelFormat(HDC hDC);
- void Rendercene();
- HDC hdc;
- HGLRC hglrc;
- //////////////////////////////////////////////////////////////////////////
- GLfloat step,s;
- DECLARE_MESSAGE_MAP()
- public:
- afx_msg void OnPaint();
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- };
6、MyOpenGL.cpp中假如以下代码:
6.1
- MyOpenGL::~MyOpenGL(void)
- {
- wglMakeCurrent(NULL,NULL);
- wglDeleteContext(hglrc);//删除渲染描述表
- ::ReleaseDC(m_hWnd,hdc);//释放设备描述表
- }
- int MyOpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CWnd::OnCreate(lpCreateStruct) == -1)
- return -1;
- // TODO: Add your specialized creation code here
- if(MySetPixelFormat(::GetDC(m_hWnd))==FALSE)
- return 0;
- // 获得绘图描述表
- hdc = ::GetDC(m_hWnd);
- // 创建渲染描述表
- hglrc = wglCreateContext(hdc);
- // 使绘图描述表为当前调用现程的当前绘图描述表
- wglMakeCurrent(hdc, hglrc);
- return 0;
- }
6.3 在OnPaint()加入
- void MyOpenGL::OnPaint()
- {
- //CPaintDC dc(this); // device context for painting
- // TODO: Add your message handler code here
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
- Rendercene();
- glPopMatrix();
- glFlush();
- SwapBuffers(hdc);
- // Do not call CWnd::OnPaint() for painting messages
- }
6.4 成员函数实现代码
- int MyOpenGL::MySetPixelFormat(HDC hDC)
- {
- PIXELFORMATDESCRIPTOR pixelDesc;
- pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
- pixelDesc.nVersion = 1;
- pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
- PFD_SUPPORT_OPENGL |
- PFD_DOUBLEBUFFER |
- PFD_TYPE_RGBA;
- pixelDesc.iPixelType = PFD_TYPE_RGBA;
- pixelDesc.cColorBits = 32;
- pixelDesc.cRedBits = 0;
- pixelDesc.cRedShift = 0;
- pixelDesc.cGreenBits = 0;
- pixelDesc.cGreenShift = 0;
- pixelDesc.cBlueBits = 0;
- pixelDesc.cBlueShift = 0;
- pixelDesc.cAlphaBits = 0;
- pixelDesc.cAlphaShift = 0;
- pixelDesc.cAccumBits = 0;
- pixelDesc.cAccumRedBits = 0;
- pixelDesc.cAccumGreenBits = 0;
- pixelDesc.cAccumBlueBits = 0;
- pixelDesc.cAccumAlphaBits = 0;
- pixelDesc.cDepthBits = 0;
- pixelDesc.cStencilBits = 1;
- pixelDesc.cAuxBuffers = 0;
- pixelDesc.iLayerType = PFD_MAIN_PLANE;
- pixelDesc.bReserved = 0;
- pixelDesc.dwLayerMask = 0;
- pixelDesc.dwVisibleMask = 0;
- pixelDesc.dwDamageMask = 0;
- int iPixelFormat;
- // 为设备描述表得到最匹配的像素格式
- if((iPixelFormat = ChoosePixelFormat(hDC, &pixelDesc)) == 0)
- {
- MessageBox("ChoosePixelFormat Failed", NULL, MB_OK);
- return FALSE;
- }
- // 设置最匹配的像素格式为当前的像素格式
- if(SetPixelFormat(hDC, iPixelFormat, &pixelDesc) == FALSE)
- {
- MessageBox("SetPixelFormat Failed", NULL, MB_OK);
- return FALSE;
- }
- return TRUE;
- }
- void MyOpenGL::Rendercene()
- {
- glBegin(GL_LINES);
- glVertex2f(-0.5f,-0.3f);
- glVertex2f(0.4f,0.6f);
- glEnd();
- }
7.在对话框的头文件里加入:#include MyOpenGL.h
添加成员变量 MyOpenGL* m_GL;
然后在其OnCreate()函数中初始化:
- int CMFC_GL_TestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CDialog::OnCreate(lpCreateStruct) == -1)
- return -1;
- // TODO: Add your specialized creation code here
- // 定义OpenGL绘图窗口的矩形大小
- //此段语句放在OnInitDialog(),或者OnCreate中
- CRect rect(0,0,300,300);
- m_GL=new MyOpenGL;//用New的方式创建
- m_GL->Create( NULL, //缺省的窗口
- NULL, //无窗口名称
- WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE,
- // 定义窗口风格
- rect, // 窗口的大小
- this, // 指定当前对话框为其父窗口指针
- 0);
- return 0;
- }
接下来就可以运行了。
效果图:
0 0
- MFC的对话框中使用OpenGL绘图
- MFC的对话框中使用OpenGL绘图
- 在VS2010里MFC对话框中使用OpenGL绘图,添加的控件不显示的一种解决方法
- MFC对话框程序中使用OpenGL
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- 基于MFC的OpenGL绘图
- MFC中对话框的使用
- opengl 基于MFC的OpenGL绘图原理
- MFC对话框程序中使用opengl实现漫游
- 【引用】[转]对.lds连接脚本文件的分析
- Uboot 移植
- 【转】编译,链接与库的使用(1)
- qmake pro工程设置
- 【转】编译,链接与库的使用(2)
- MFC的对话框中使用OpenGL绘图
- 分布式tetware 的移植和配置
- 养胃
- 做胃镜感受
- win7下硬盘安装fedora15
- 浅谈多进程多线程的选择
- 转载 Socket与TCP/IP的关系 转(非常好的一篇文章!)
- 利用protobuffer 将 .proto 文件转成 .pb.cc 文件注意事项
- selinux学习笔记