用MFC实现OpenGL编程

- #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
- #include <afxwin.h> // MFC core and standard components
- #include <afxext.h> // MFC extensions
- #include <gl/gl.h> // OpenGL32库的头文件
- #include <gl/glu.h> // GLu32库的头文件
- #include <gl/glaux.h> // GLaux库的头文件
- #ifndef _AFX_NO_AFXCMN_SUPPORT
- #include <afxcmn.h> // MFC support for Windows 95 Common Controls
- #endif // _AFX_NO_AFXCMN_SUPPORT
- //同样也可以使用下列方式连接lib
- #pragma comment( lib, "opengl32.lib") // OpenGL32连接库
- #pragma comment( lib, "glu32.lib") // GLu32连接库
- #pragma comment( lib, "glaux.lib") // GLaux连接库
- #pragma comment( lib, "glut32.lib") // GLut连接库
- BOOL COpenGlView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
- cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
- return CView::PreCreateWindow(cs);
- }
产生一个RC的第一步是定义窗口的像素格式。像素格式决定窗口着所显示的图形在内存中是如何表示的。由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将有对这些参数的设置。我们先在COpenGLView的类中添加一个保护型的成员函数BOOL SetWindowPixelFormat(HDC hDC),并编辑其中的代码。
- BOOL COpenGLView::SetWindowPixelFormat(HDC hDC)
- {
- PIXELFORMATDESCRIPTOR pixelDesc;
- pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
- pixelDesc.nVersion = 1;
- pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
- PFD_DRAW_TO_BITMAP |
- PFD_SUPPORT_OPENGL |
- PFD_SUPPORT_GDI |
- PFD_STEREO_DONTCARE;
- pixelDesc.iPixelType = PFD_TYPE_RGBA;
- pixelDesc.cColorBits = 32;
- pixelDesc.cRedBits = 8;
- pixelDesc.cRedShift = 16;
- pixelDesc.cGreenBits = 8;
- pixelDesc.cGreenShift = 8;
- pixelDesc.cBlueBits = 8;
- pixelDesc.cBlueShift = 0;
- pixelDesc.cAlphaBits = 0;
- pixelDesc.cAlphaShift = 0;
- pixelDesc.cAccumBits = 64;
- pixelDesc.cAccumRedBits = 16;
- pixelDesc.cAccumGreenBits = 16;
- pixelDesc.cAccumBlueBits = 16;
- pixelDesc.cAccumAlphaBits = 0;
- pixelDesc.cDepthBits = 32;
- pixelDesc.cStencilBits = 8;
- pixelDesc.cAuxBuffers = 0;
- pixelDesc.iLayerType = PFD_MAIN_PLANE;
- pixelDesc.bReserved = 0;
- pixelDesc.dwLayerMask = 0;
- pixelDesc.dwVisibleMask = 0;
- pixelDesc.dwDamageMask = 0;
- m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
- if (m_GLPixelIndex==0) // Let's choose a default index.
- {
- m_GLPixelIndex = 1;
- if (DescribePixelFormat(hDC, m_GLPixelIndex,
- sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc)==0)
- {
- return FALSE;
- }
- }
- if (SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc)==FALSE)
- {
- return FALSE;
- }
- return TRUE;
- }
- int COpenGlView::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CView::OnCreate(lpCreateStruct) == -1)
- return -1;
- // TODO: Add your specialized creation code here
- HWND hWnd = GetSafeHwnd();
- HDC hDC = ::GetDC(hWnd);
- if (SetWindowPixelFormat (hDC)==FALSE)
- return 0;
- if (CreateViewGLContext (hDC)==FALSE)
- return 0;
- return 0;
- }
5、代码解释
- BOOL COpenGlView::CreateViewGLContext(HDC hDC)
- {
- m_hGLContext = wglCreateContext(hDC);//用当前DC产生绘制环境(RC)
- if (m_hGLContext == NULL)
- {
- return FALSE;
- }
- if (wglMakeCurrent(hDC, m_hGLContext)==FALSE)
- {
- return FALSE;
- }
- return TRUE;
- }
- int COpenGlView::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CView::OnCreate(lpCreateStruct) == -1)
- return -1;
- // TODO: Add your specialized creation code here
- HWND hWnd = GetSafeHwnd();
- HDC hDC = ::GetDC(hWnd);
- if (SetWindowPixelFormat (hDC)==FALSE)
- return 0;
- if (CreateViewGLContext (hDC)==FALSE)
- return 0;
- return 0;
- }
- void COpenGlView::OnDestroy()
- {
- CView::OnDestroy();
- // TODO: Add your message handler code here
- if(wglGetCurrentContext()!=NULL)
- {
- // make the rendering context not current
- wglMakeCurrent(NULL, NULL) ;
- }
- if (m_hGLContext!=NULL)
- {
- wglDeleteContext(m_hGLContext);
- m_hGLContext = NULL;
- }
- }
- COpenGlView::COpenGlView()
- {
- // TODO: add construction code here
- m_hGLContext = NULL;
- m_GLPixelIndex = 0;
- }
- void COpenGlView::OnSize(UINT nType, int cx, int cy)
- {
- CView::OnSize(nType, cx, cy);
- // TODO: Add your message handler code here
- GLsizei width, height;
- GLdouble aspect;
- width = cx;
- height = cy;
- if (cy==0)
- aspect = (GLdouble)width;
- else
- aspect = (GLdouble)width/(GLdouble)height;
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0.0, 500.0*aspect, 0.0, 500.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- void COpenGlView::OnDraw(CDC* /*pDC*/)
- {
- COpenGlTestMFCDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if (!pDoc)
- return;
- // TODO: add draw code for native data here
- glLoadIdentity();
- glClear(GL_COLOR_BUFFER_BIT);
- glBegin(GL_POLYGON);
- glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
- glVertex2f(100.0f, 50.0f);
- glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
- glVertex2f(450.0f, 400.0f);
- glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
- glVertex2f(450.0f, 50.0f);
- glEnd();
- glFlush();
- }
用MFC实现OpenGL编程的更多相关文章
- [转]VS 2012环境下使用MFC进行OpenGL编程
我就不黏贴复制了,直接给出原文链接:VS 2012环境下使用MFC进行OpenGL编程 其它好文链接: 1.OpenGL系列教程之十二:OpenGL Windows图形界面应用程序
- Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤
http://blog.csdn.net/vagrxie/article/details/4602961 Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤 wri ...
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- MFC下OpenGL入门(可以用)
MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...
- 在 Mac OS X Yosemite 10.10.5 上配置 OpenGL 编程环境
这个教程主要参考了youtube上的视频 Getting Started in OpenGL with GLFW/GLEW in Xcode 6 ,这个视频有点问题,不能照搬.本人通过自己摸(瞎)索( ...
- MFC下DLL编程(图解)
MFC下DLL编程(图解) DLL(Dynamic Link Library,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库.DLL是应用程序的一种 ...
- 基于MFC的socket编程
网络编程 1.windows 套接字编程(开放的网络编程接口)添加头文件#include<windows.h> 2.套接字及其分类 socket分为两种:(1)数据报socket:无连接套 ...
- MFC控件编程进度条编写
MFC控件编程进度条编写 一丶进度条编程需要用到的方法 进度条MFC已经帮我们封装好类了. 叫做 CProgressCtrl 进度条编程也很简单. 封装的方法也就那个那几个. GetPos() 获 ...
随机推荐
- GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)
一.前言 GDAL具有强大的图像读写功能,但是对常用图像处理算法的集成较少,OpenCV恰恰具有较强的图像处理能力,因此有效的结合两者对图像(遥感影像)的处理带来了极大的方便.那么如何实现GDAL与o ...
- MFC连接ftp服务器
CInternetSession* m_pInetSession; CFtpConnection* m_pFtpConnection; //连接服务器的函数 BOOL CftpClientDlg: ...
- win7+64安装PLSQL Developer 32位
原因分析:在网上搜索了半天,主要原因是oci.dll是64位的,而PL/SQL developer只有32位的,在使用64位oci.dll文件时出错! 解决方案(最便捷):1.到oracle官网下载O ...
- delphi代码实现创建dump文件
I used a "watchdog" thread for this, which checks if the mainform is responding, and make ...
- 如何使用TestFlight进行App构建版本测试(转)
在日常的开发当中,当一个项目在开发过程中或者完成准备上线,都需要我们进行真机测试,否则不可能开发完了就直接扔到了App,等上线了再下载看看,这都是不可能的.那么说到真机测试,大家肯定会想到弄一个99美 ...
- TestWriter自动化测试介绍
简介: TestWriter是上海博为峰结合多年为企业做测试服务的经验所研发的一款具有自主知识产权的自动化测试工具,为企业用户提供真正的低成本.高效率的自动化测试,引领软件测试自动化运用由技术层面向业 ...
- 高性能浏览器网络(High Performance Browser Networking) 第二章
第2章 TCP篇 互联网的核心是两个协议,IP和TCP. IP也叫Internet协议,提供主机到主机的路由和寻址:TCP,传输控制协议,在不可靠的传输通道上提供一个可靠的网络抽象.TCP / IP协 ...
- UVA 246 10-20-30
题意: 给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,如果有牌堆形成了以下3种情况(按顺序判断):1.头两张+尾一张和为10或20或30.2.头一张+尾两张和为10或20或30. ...
- C# 7 函数 青歌赛打分 天气预报
函数: 数据类型--变量常量--运算符表达式--语句(顺序,分支,循环)--数组--函数 程序里的函数:能完成一个相对独立功的代码块. 数学里的函数:高度抽象. 函数四要素:函数名,输入,输出,加工 ...
- C++结构体中sizeof(1)
sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的 ...