📄 base6.htm
字号:
nRgnType= CombineRgn (hDestRgn,hSrcRgnl,hSrcRgn2,nCombine);<br>
通过组合两个已存在区域而产生一个新的区域。组合区域的方法由nCombine参数加以说明:<br>
这里的hSrcRgnl和hSrcRgn2标识两个已存在的区域,hDestRgn标识将被新区域替换的作为目标的已存在区域。<br>
一个区域用完后,可用DeleteObject(hRgn)删除它。<br>
<br>
FloodFiLL (hdc,xStart,yStart,rgbColor);<br>
本函数用当前刷子填充显示表面的一个区域,该区域假定由rgbColor多数指定的颜色边界确定,FloodFill函数由xStart,yStart参数指定的,点开始向各个方向进行填充,直到颜色边界为止。<br>
ExtFLoodFill(hdc,xStart,yStart,rgbColor,wFill );<br>
此函数用当前刷子填充显示表面上的某一区域,若wFill被设置成FLOODFILLBORDER,此区域将完全用rgbColor设定的颜色作为边界,ExtFloodFill从(xStart,yStart)点开始向各个方向填充,直到该颜色边界为止。若wFill被设置成FLOODFILLSURFACE,则ExtFLOODFILL函数从(xStart,yStart)点开始,向各个方向对所有包含由rgbColor参数设定的颜色的相邻区域进行填充。<br>
DrowIcon(hdc,xStort,yStart,hIcon) ;<br>
本函数在指定设备上画一个图标。(xStart,yStart)为图标的左上角,hIcon标识要画的图标,它与hBitmap一样,可以由SDKPAINT画出,在.
rc文件中定义,用LoadIcon获得。<br>
ScrollWindow (hwnd,xScroll,yScroll,&rectScroll,&rectClip) ;<br>
本函数通过移动一个窗口用户区域的内容来滚动该窗口,沿X轴移动xScroll个单位,沿Y轴移动yScroll个单位,rectScroll表示用户区域要滚动的那一部分内容,rectClip表示要滚动的裁剪矩形。<br>
ScrollDC(hdc,dx,dy,lprcScroll,lprcClip, hrgnUpdate,lprcUpdate); <br>
此函数水平地和垂直地滚动由位构成的矩形。lprcScroll指向要滚动的矩形,dx表示水平滚动单位,dy表示垂直滚动单位,lprcClip指向裁剪矩形,hrgnUpdate返回滚动过程没有覆盖的区域,lprcUpdate返回需要重画的最大矩形区域。<br>
<br>
OpenGL是近几年发展起来的一个性能卓越的三维图形标准,它是在SGI等多家
世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通用共享的开放式三维图形标准。目前,包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做为三维图形标准,许多软件厂商也纷纷以OpenGL
为基础开发出自己的产品,其中比较著名的产品包括动画制作软件Soft
Image 和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软件ProEngineer、GIS软ARC/INFO等等。值得一提的是,随着Microsoft公司在Windows
NT和最新的Windows 95中提供了OpenGL标准及OpenGL三维图形加速卡(如北京黎明电子技术公司的AGC-3D系列三维图形加速卡)的推出,OpenGL将在微机中有广泛地应用,同时也为广大用户提供了在微机上使用以前只能在高性能图形工作站上运行的各种软件的机会。<br>
OpenGL实际上是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual
C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性。<br>
OpenGL使用简便,效率高。它具有七大功能: <br>
1) 建模 OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面
(如Bezier、Nurbs等曲线或曲面)绘制函数。 <br>
2) 变换 OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。其变换方法与机器人运动学中的坐标变换方法完全一致,有利于减少算法的运行时间,提高三维图形的显示速度。 <br>
3) 颜色模式设置 OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color
Index)。 <br>
4) 光照和材质设置OpenGL光有辐射光(Emitted Light)、环境光(Ambient
Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。 <br>
材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。 <br>
5) 纹理映射(Texture Mapping) 利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。 <br>
6) 位图显示和图象增强
图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。 <br>
以上这三条可使被仿真物更具真实感,增强图形显示的效果。 <br>
7) 双缓存(Double Buffering)动画
双缓存即前台缓存和后台缓存,简而言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。 <br>
此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion
Blur)等特殊效果。从而实现了消隐算法。<br>
<br>
OpenGL图形库一共有100多个函数。其中核心函数有115个,它们是最基本的函数,其前缀是gl,OpenGL实用库(OpenGL
utility library , GLU)的函数功能更高一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个,前缀为glu;OpenGL辅助库(OpenGL
auxiliary library ,GLAUX)的函数是一些特殊的函数,包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux。 <br>
此外,还有六个WGL函数非常重要,专门用于OpenGL和Windows 95窗口系统的联接,其前缀为wgl,主要用于创建和选择图形操作描述表(rendering
contexts)以及在窗口内任一位置显示字符位图。这些功能是Windows
95 对OpenGL的唯一补充。 <br>
另外,还有五个Win32函数用来处理像素格式(pixel formats)和双缓存。由于它们是对Win32系统的扩展,因此不能应用在其它OpenGL平台上。<br>
<br>
OpenGL for Windows 95的设计与OpenGL for UNIX的程序设计有一点小区别,关键就在于如何将OpenGL与不同的操作系统下的窗口系统联系起来。 <br>
如果调用OpenGL辅助库窗口管理函数,则不用考虑这些问题。下面简要介绍在
Windows 95下 OpenGL 的程序设计关键。 <br>
1.图形操作描述 <br>
在Windows 95下窗口程序必须首先处理设备描述表(Device Contexts
,DC),DC包括许多如何在窗口上显示图形的信息,既指定画笔和刷子的颜色,设置绘图模式、调色板、映射模式以及其它图形属性。同样,OpenGL
for Windows 95的程序也必须使用DC,这与其它Windows 95程序类似。但是,OpenGL
for Windows 95必须处理特殊的DC图形操作描述表,这是DC中专为OpenGL使用的一种。一个OpenGL应用图形操作描述表内有OpenGL与Windows
95窗口系统相关的各种信息。一个OpenGL应用首先必须创建一个图形操作描述表,然后再启动它,最后在所定义的窗口内按常规方式调用OpenGL函数绘制图形。 <br>
一个图形操作描述表不同于其它DC,它们调用每个GDI函数都需要一个句柄,而图形操作描述表方式下只需一个句柄就可以任意调用OpenGL函数。也就是说,只要当前启用了某个图形操作描述表,那么在未删除图形操作描述表之前可以调用任何OpenGL函数,进行各种操作。<br>
2.像素格式 <br>
在创建一个图形操作表之前,首先必须设置像素格式。像素格式含有设备绘图界面的属性,这些属性包括绘图界面是用RGBA模式还是颜色表模式,像素缓存是用单缓存还是双缓存,以及颜色位数、深度缓存和模板缓存所用的位数,还有其它一些属性信息。 <br>
3.像素格式结构 <br>
每个OpenGL显示设备都支持一种指定的像素格式。一般用一个名为PIXELFORMATDESCRIPTOR的结构来表示某个特殊的像素格式,这个结构包含26个属性信息。Win32定义PIXELFORMATDESCRIPTOR如下所示: <br>
typedef struct tagPIXELFORMATDESCRIPTOR <br>
{ kk1}<br>
// pfd <br>
WORD nSize; <br>
WORD nVersion; <br>
DWORD dwFlags; <br>
BYTE iPixelType; <br>
BYTE cColorBits; <br>
BYTE cRedBits; <br>
BYTE cRedShift; <br>
BYTE cGreenBits; <br>
BYTE cGreenShift; <br>
BYTE cBlueBits; <br>
BYTE cBlueShift; <br>
BYTE cAlphaBits; <br>
BYTE cAlphaShift; <br>
BYTE cAccumBits; <br>
BYTE cAccumRedBits; <br>
BYTE cAccumGreenBits; <br>
BYTE cAccumBlueBits; <br>
BYTE cAccumAlphaBits; <br>
BYTE cDepthBits; <br>
BYTE cStencilBits; <br>
BYTE cAuxBuffers; <br>
BYTE iLayerType; <br>
BYTE bReserved; <br>
DWORD dwLayerMask; <br>
DWORD dwVisibleMask; <br>
DWORD dwDamageMask; <br>
} PIXELFORMATDESCRIPTOR;<br>
<br>
4.初始化PIXELFORMATDESCRIPTOR结构 <br>
PIXELFORMATDESCRIPTOR中每个变量值的具体含义和设置可以参考有关资料,下面举出一个PIXELFORMATDESCRIPTOR初始化例子来简要说明相关变量的意义。定义PIXELFORMATDESCRIPTOR结构的pfd如下: <br>
PIXELFORMATDESCRIPTOR pfd = { kk1}<br>
sizeof(PIXELFORMATDESCRIPTOR), . //size of this pfd 1<br>
PFD_DRAW_TO_WINDOW| // support window <br>
PFD_SUPPORT_OPENGL| // support OpenGL <br>
PFD_DOUBLEBUFFER, // double buffered <br>
PFD_TYPE_RGBA, // RGBA type <br>
24, // 24-bit color depth <br>
0,0,0,0,0,0, // color bits ignored <br>
0, // no alpha buffer <br>
0, // shift bit ignored <br>
0, // no accumulation buff <br>
0,0,0,0, // accum bits ignored <br>
32, // 32-bit z-buffer <br>
0, // no stencil buffer <br>
0, // no auxiliary buffer <br>
PFD_MAIN_PLANE, // main layer <br>
0, // reserved <br>
0,0,0 // layer masks ignored <br>
}; <br>
在这个结构里,前两个变量的含义十分明显。第三个变量dwFlags的值是<br>
PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL ,<br>
表明应用程序使用OpenGL函数来绘制窗口<br>
第四个:<br>
PFD_DOUBLEBUFFER,<br>
表明当前采用RGBA颜色模式,第五个采用24位真彩色,既1.67千万种颜色,如果是256色系统则自动实现颜色抖动;因为没有使用alpha缓存和累计缓存,所以从变量cAlphaBits到cAccumAlphaBits都设置为0;深度缓存设置为32位,这个缓存能解决三维场景的消隐问题;变量cAuxBuffers设置为0,在Windows
95下不支持辅助缓存;Windows 95下针对OpenGL变量ilayerType只能设置为PFD_MAIN_PLANE,但在其它平台也许支持PFD_MAIN_PLANE或PFD_MAIN_UNDERLAYPLANE;接下来bReserved变量只能设为0,而最后三个变量Windows
95都不支持,故全设置为0。 <br>
5.设置像素结构 <br>
当初始化PIXELFORMATDESCRIPTOR结构后,就要设置像素格式。下面举例说明如何设置像素格式。 <br>
CClientDC clientDC(this); <br>
int PixelFormat = ChoosePixelFormat(clientDC.m_hDC,&pfd); <br>
BOOL result=SetPixelFormat(clientDC.m_hDC,PixelFormat,&pfd); <br>
第一行语句说明如何得到一个应用窗口客户区的设置描述表。 <br>
第一行调用ChoosePixelFormat( )选择一个像素格式,并将像素格式索引号返回给pixelFormat变量;函数中第一个参数是选择像素格式的设备描述表的句柄,第二个参数是PIXELFORMATDESCRIPTOR结构的地址。如果调用失败则返回0;否则返回像素格式索引号。 <br>
第三行调用SetPixelFormat( )设置像素格式,三个参数分别是设备描述表的句柄、像素格式索引号和PIXELFORMATDESCRIPTOR结构的地址。如果调用成功则返回TRUE,否则返回FALSE。 <br>
6.创建图形操作描述表 <br>
正如前所述,必须创建图形操作描述表并启用它后,才能调用OpenGL函数在窗口内进行各种图形操作。一般来说,利用
MFC
中增补的管理图形操作描述表方法来编程比较方便。即在视类
(CView) 的消息 OnCreat( ) 中创建图形操作描述表。<br>
<a href = "#top">返回到上面</a>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -