RC与DC的介绍与使用

来源:互联网 发布:从零开始学java知乎 编辑:程序博客网 时间:2024/05/22 15:48
 
OpenGL的绘图方式与Windows一般的绘图方式是不同的,主要区别如下:
1、Windows采用的是GDI在设备描述表DC上进行绘图。
2、OpenGL采用的是OpenGL相关的函数在渲染描述表RC上进行绘图。
3、OpenGL使用的是特殊的像素格式。
在Windows中使用GDI绘图时必须指定在哪个设备环境DC中绘制,同同样的在使用OpenGL函数时也必须指定一个所谓的渲染环境。正如DC要存储GDI的绘制环境信息如笔,刷和字体等,RC也必须保存OpenGL所需的渲染信息如像素格式等。
渲染环境主要由以下六个wgl函数来管理:
1、HGLRC wglCreateContext( HDC hdc )
该函数用来创建一个OpenGL可用的渲染环境。hdc必须是一个合法的支持至少16位色的屏幕设备描述表DC或内存设备描述表的句柄。该函数在调用前,设备描述表必须设置好适当的像素格式。成功创建渲染描述表之后,hdc可以释放或删除。函数返回NULL值表示失败,否则返回值为渲染上下文的句柄。
2、BOOL wglDeleteContex( HGLRC hglrc )
该函数删除一个RC,一般应用程序在删除RC之前,应使它成为非现行RC,不过,删除一个现行RC也是可以得。此时,OpenGL系统冲掉等待的绘图命令并使之成为非现行RC,后删除之。注意:删除一个属于别的线程的RC时会导致失败。
3、HGLRC wglGetCurrentcontext( void )
该函数返回线程的现行RC,如果线程无现行RC则返回NULL
4、HDC wglGetCurrentDC( void )
该函数返回与线程现行RC关联的DC,如果线程无现行RC则返回NULL。
5、BOOL wglMakeCurrent( HDC hdc, HGLRC hglrc )
该函数把hdc和hglrc关联起来,并使hglrc成为调用线程的现行RC,如果传给hglrc的值为NULL,则函数解除关联,并置线程的现行RC为非现行RC,测试忽略hdc参数。
注意:传给该函数的hdc可以不是调用wglCreateContext时使用的值,但是,他们所关联的设备必须相同并且拥有相同的像素格式。一个RC可以由几个现行RC,这是针对调用线程而言的。一个线程在拥有现行RC进行绘图时,别的现场将无法同时绘图。一个线程一次只能拥有一个现行的RC,但是可以拥有多个RC;一个RC也可以由多个线程共享,但是他每次只能在一个线程中试现行RC。在使用RC时,不应该释放或者删除与之关联的DC。如果应用程序在整个生命期内保持一个现行RC,则应用程序也一直占有一个DC资源。Windows系统只有有限的DC资源。

管理RC与DC两种方法
1、在WM_CREATE消息响应时创建RC,创建后立即释放DC;当WM_PAINT消息到来时,程序再获取DC句柄,并与RC关联起来,绘图完成后,立即解除RC与DC得关联并释放DC;当WM_DESTROY消息到来时,程序只需简单的删除RC。
2、RC在程序开始时创建并使之成为现行RC。它将保持为现行RC直至程序结束。相应的,GETDC在程序开始调用,RELEASEDC在程序结束时才调用。此中方法的好处是在相应WM_PAINT消息时,无需调用十分耗时的wglMakeCurrent函数。一般它要消耗几千个时钟周期。









原创粉丝点击