MFC单文档结构,实现OpenGL的绘图,移动,旋转,缩放

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小时不停为我们工作。

MFC单文档结构,实现OpenGL的绘图,移动,旋转,缩放

相关文章:

你感兴趣的文章:

标签云: