MFC单文档结构,实现OpenGL的绘图,移动,旋转,缩放
基本知识:
Windows应用程序是使用设备描述表(Device Context,简写为"DC")进行图形的绘制输出,
但OpenGL并不使用标准的设备描述表,它使用渲染描述表(Rendering Context,简写为"RC")完成图形图像的映射。
描述表的映射核心是像素格式的设置。
当进行OpenGL的绘图操作时,实际上是在进行设备像素的操作。OpenGL将数据转化为像素操作写入帧缓存中,就需要知道Windows的像素格式, 或者说需要与其一致起来。在初始化OpenGL时,需要一个叫做PIXELFORMATDESCRIPTOR的结构来完成对像素属性的设置。
Win32提 供了4个函数管理像素格式。
①ChoosePixelFormat():返回和&pfd指定的像素格式最匹配的DC支持的像素格式的索引值,如果函数调用不成功,返回零。
②SetPixelFormat():在DC中设置pixelformat指定的设备的像素格式,如果函数调用成功,返回TRUE。
③GetPixelFormat():返回当前DC的像素格式的索引,如果函数调用不成功,返回零。
④DescribePixelFormat():用n指定的DC的像素格式的数据设置&pfd,如果函数调用成功,返回DC的像素格式的最大索引,否则,返回零。
OpenGL的渲染描述表保存着在窗口中用来渲染一个场景所需的信息。一个OpenGL应用程序必须有一个渲染描述表,并且在OpenGL进行绘制之前它应该是当前的。在渲染描述表存入信息后,OpenGL就可以在Windows系统中更新一个窗口的图形状态。
Win32提供了5个函数管理渲染描述表。
①wglCreateContext():创建一个与给定的DC兼容的RC,调用成功返回RC的句柄,不成功返回NULL。
②wglMakeCurrent():使指定的RC成为当前的,调用成功返回GL_TRUE,否则返回GL_FALSE。
③wglGetCurrentCotext():获得当前的RC句柄。
④wglGetCurrentDC():获得和当前的RC联系的DC句柄。
⑤wglDeleteContext():删除RC。
/* Pixel format descriptor */typedef struct tagPIXELFORMATDESCRIPTOR{ WORD nSize; WORD nVersion; DWORD dwFlags; BYTE iPixelType; BYTE cColorBits; BYTE cRedBits; BYTE cRedShift; BYTE cGreenBits; BYTE cGreenShift; BYTE cBlueBits; BYTE cBlueShift; BYTE cAlphaBits; BYTE cAlphaShift; BYTE cAccumBits; BYTE cAccumRedBits; BYTE cAccumGreenBits; BYTE cAccumBlueBits; BYTE cAccumAlphaBits; BYTE cDepthBits; BYTE cStencilBits; BYTE cAuxBuffers; BYTE iLayerType; BYTE bReserved; DWORD dwLayerMask; DWORD dwVisibleMask; DWORD dwDamageMask;} PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, FAR *LPPIXELFORMATDESCRIPTOR;
=============================================================
创建一个单文档结构的MFC程序
=============================================================
窗口创建之前我们须设置窗口风格
WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和
WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)
从而避免OpenGL绘制到其他窗口中去。
这些应该在窗口创建之前设置好,则代码位于PreCreateWindow()中。
BOOL CLDSView::PreCreateWindow(CREATESTRUCT& cs){ // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN; return CView::PreCreateWindow(cs);}
=============================================================
在窗口创建时,则需要将OpenGL的环境设置好
int CLDSView::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 InitializeOpenGL(); return 0;}
定义如下变量:
CClientDC* m_pDC; // Device Context 设备描述表
HGLRC m_hRC; // Render Context 着色描述表
Windows应用程序是使用设备描述表(Device Context,简写为"DC")进行图形的绘制输出,
但OpenGL并不使用标准的设备描述表,它使用渲染描述表(Rendering Context,简写为"RC")
初始化OpenGL如下:
最有效的资本是我们的信誉,它24小时不停为我们工作。