Windows使用一个称为设备环境(Device Context)的对象的方法——但该对象并没有创建一个C++类,因为Windows早于并存在于C++之外。设备环境对象用一些默认值创建,可以用它们创建默认的设备环境。应用Windows绘制一直线,所需的是一个i额设备环境对象的指针和直线坐标,设备环境对象的指针叫做设备环境句柄(HDC)。
::MoveTo(HDC hdc, int x, int y);
::LineTo(HDC hdc, int x, int y);
要绘制一个完整的形状,::MoveTo()函数只被调用一次。然后,::LineTo()函数被调用。
因为设备环境在内存中创建,而内存经常受到扰动,它的地址可能是经常变化的。因此,一个设备环境句柄不是直接指向设备环境,而是指向另外一个跟踪设备环境地址的指针。
- 在MFC中创建一个设备环境
MFC用CDC类封装了一个设备环境对象,CDC的成员变量m_hdc指向它所拥有的设备环境,用户可以创建四种类型的设备环境:
屏幕
打印机
只有打印机的信息部分
位图
创建一个屏幕设备环境,可以用:
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( )只返回指向该类设备环境的
指针。此外,在窗口类的存在期间,设备环境一直保留它的值。必
须注意不要让两个由相同的窗口类创建的窗口在同一时间绘图。
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);
注意:私有设备环境和类设备环境不必释放。
用户最有可能用通用设备环境来做绘图工作。每次释放一个通用设备环境时,为它们设置的值都被丢失。但是,可以用下面两个CDC成员函数保存和恢复一个设备环境的设置值:
SaveDC()保存设备环境的当前状态;
RestoreDC()将设备环境恢复到用SaveDC()保存的状态。