CDC类

来源:互联网 发布:美版iphone有4g网络 编辑:程序博客网 时间:2024/04/30 09:17
  CDC应用  

M F C用C D C类封装了一个设备环境对象, CDC的成员变量m _ h d c指向它所拥有的设备环境,用户可以创建四种类型的设备环境:
■ 屏幕。
■ 打印机。
■ 只有打印机的信息部分。
■ 位图。
创建一个屏幕设备环境,可以用:
CDC * pDC=GetDC( );
这里的GetDC( )是CWnd类的成员函数,它返回一个允许用户绘制它的窗口客户区的设备
环境;如果还希望绘制非客户区,则使用:
CDC *pDC=GetWindowDC( );
如果需要绘制整个屏幕,如编写一个屏幕保护程序或游戏程序时,可能需要对整屏进行
绘制,这时使用:
CDC *pDC=CDC::FromHandle (::GetDC (NULL));
屏幕设备环境来自三种资源之一:私有设备环境、类设备环境和通用设备环境。
1. 私有设备环境
创建窗口时,私有设备环境便创建了,并在窗口存在期间一直存在。要使窗口创建一个
私有设备环境,必须在目标窗口的窗口类中设置C S _ O W N D C标志,这时GetDC( )返回一个私有设备环境的指针,而不创建一个设备环境。在窗口存在期间,为私有设备环境所作的任何变化都被保存。私有设备环境主要在以图形为中心的应用程序中使用,在那里经常地分配一
个设备环境,这样会占用非常多的C P U时间。
2. 类设备环境
类设备环境在注册一个窗口类时创建,并在窗口类的存在期间一直存在。要使窗口类创
建它自己的类设备环境,必须设置C S _ C L A S S D C标志,GetDC( )只返回指向该类设备环境的指针。此外,在窗口类的存在期间,设备环境一直保留它的值。然而,在第1章中已提及,必须注意不要让两个由相同的窗口类创建的窗口在同一时间绘图;还应注意M i c r o s o f t认为一个类设备环境是旧用法。
3. 通用设备环境
在一个通用资源堆中使用GetDC( )时,一个通用设备环境便创建了。要获得一个通用设
备环境,不要在窗口类中设置C S _ O W N D C或C S _ C L A S S D C。对于更早版本的Wi n d o w s,操作系统本身只有五个预分配的通用设备环境,因此取名G e t D C ( )与CreateDC( )相对应。必须保证在用完设备环境后释放它,否则系统将发生冲突并导致异常终止。虽然设备环境是被创建的,但内存资源还是有限的,因此在使用一个通用设备环境后,仍需用下面语句释放它:
ReleaseDC (pDC);
注意私有设备环境和类设备环境不必释放。
用户最有可能用通用设备环境来做绘图工作。每次释放一个通用设备环境时,为它们设
置的值都被丢失。但是,可以用下面两个C D C成员函数保存和恢复一个设备环境的设置值:
■ S a v e D C ( )保存设备环境的当前状态。
■ RestoreDC( )将设备环境恢复到用SaveDC( )保存的状态。
打印机
要为打印机创建一个设备环境,必须先创建一个C D C类对象,然后使用它的CreateDC( )
成员函数:
CDC dc;
dc.CreateDC(LPCTSTR lpszDriverName,
LPCTSTR lpszDeviceName,
LPCTSTR lpszOutput,
const void* lpInitData)
■ l p s z D r i v e r N a m e是打印机所用的设备驱动程序(如“H P D RV”)。
■ l p s z D e v i c e N a m e是进行打印的打印机设备的名字(如“HP Laserjet III”),设备驱动程序可以支持多种类型设备
■ l p s z O u t p u t指定设备的串口名(如,“LPT1 :”)。
■ lpInitData是任何设备专用的初始化数据。
使用打印机设备环境之后,必须用CDC类的DeleteDC ( )成员函数销毁它。但是,若在堆
栈中创建CDC类,则程序返回时,设备环境自动被删除。
CMyClass : : Drawing(。。。)
{
CDC dc;
dc . CreateDC(。。。) ;
} // CDC object and Device Context destroyed
要创建一个可以直接绘制位图的设备环境,必须先用C D C的CreateCompatibleDC( )成员
函数创建一个C D C类对象。
CDC dc;
dc.CreateCompatibleDC(HDC hdc);
CreateCompatibleDC( )用设备环境的设置值初始化它所创建的设备环境对象,因此,取
名兼容D C。应该从显示被创建的位图的设备(如屏幕、打印机)传递一个设备环境。
要真实地绘制一个位图,还必须创建一个空位图对象,并使该设备环境与该位图相关联。
CDC dc; // create CDC object
CBitmap bitmap; // create CBitmap object
d c . C r e a t e C o m p a t i b l e D C ( p D C ) ; // create Device Context object
bitmap.CreateCompatibleBitmap(pDC, ICON_WIDTH, ICON_HEIGHT);
// create Bitmap object
d c . S e l e c t O b j e c t ( & b i t m a p ) ; // point memory Device Context
// to this bitmap
绘制位图以后,必须用下列语句删除设备环境:
d c.DeleteDC( );
信息
C D C提供的最后一种设备环境类型是打印机的信息部分。
CDC dc;
d c . C r e a t e I C ( ) ;
这里的调用变量与CreateDC( )中一样。
信息设备环境只包含一台打印机或其他非屏幕设备的特性,如颜色支持等。创建信息设
备环境的速度比创建一个常规的打印机设备环境速度快,因为它只包含设备的特性。信息使
用后应当删除,与前面描述的一样。
注意正如C W n d类和它控制的窗口一样,C D C类可以用Attach( )把自己捆绑到一个已
有的设备环境上,并可用Detach( )解开自己。创建一个封装已有的设备环境的临时
C D C对象,可以用FromHandle( )。但是,当应用程序进入空闲循环时,这一临时类对
象将被删除。

 

CWnd::GetDC

CDC* GetDC( );

返回值:
如果调用成功,则返回CWnd客户区的设备环境;否则,返回NULL。这个指针可能是临时的,不能被保存以供将来使用。

说明:
这个函数获得一个指针,指向一个客户区的公用的、属于类的或者私有的设备环境,依赖于为CWnd指定的类风格。对于公用的设备环境,GetDC每次获得设备环境时都给它赋予缺省值。对于属于类的或者私有的设备环境,GetDC保持原来的属性不变。在随后的图形设备接口(GDI)函数中可以使用设备环境以在客户区中绘图。
除非设备环境属于一个窗口类,否则在绘图之后必须调用ReleaseDC成员函数以释放设备环境。由于在同一时刻只有五个公用设备环境可供使用,因此如果释放设备环境时失败,可能导致其它应用程序不能访问设备环境。
如果在注册窗口类的时候,在WNDCLASS的风格中指定了CS_CLASSDC,CS_OWNDC或CS_PARENTDC,则GetDC成员函数将返回属于CWnd类的设备环境。

例如:

CDC* pDC=GetDC();

原创粉丝点击