DC-设备环境:一种WINDOWS的数据结构,包括了与一个设备(如显示器或打印机)的绘制属性相关的信息。
所有的绘制操作通过一个设备环境对象来进行。
DC基本构成:
1.CDC类 封装了所有图形输出函数,包括矢量、光栅、文本输出。
2.CClientDC类 客户区设备环境,调用时使用GetDC(),释放时使用ReleaseDC().
3.CPaintDC类 响应窗口重绘消息(WM_PAINT)时的绘画输出。在构造是调用BeginPaint(),释放时调用EndPaint();
4.CMetaFileDC类 专门用于图元文件的绘制。图元文件记录了一组GDI命令,可通过这一组GDI命令重建图形输出。
获得DC的方法:
1.在处理WM_PAINT消息时,使用BeginPaint和EndPaint,函数定义:
CDC* BeginPaint(LPPAINTSTRUCT lpPaint);
void EndPaint(LPPAINTSTRUCT lpPaint);
lpPaint是指向PAINTSTRUCT结构的指针。
使用BeginPaint获得设备句柄,只能在返回的区域内绘图。
2.处理非WM_PAINT消息时,用GetDC()和ReleaseDC()函数
可以在整个显示区域上绘图,同样使用GetDC()和ReleaseDC()不会使显示区域中的无效区域变有效。
3.Windows程序还可以取得适用于整个窗口(而不局限于窗口显示区域)的设备环境句柄:
CDC* GetWindowDC();
使用它,必须拦截WM_NCPAINT消息,Windows使用该消息在窗口的非显示区域上绘图。
4.取得设备句柄的另一个更通用的函数是CreateDC:
BOOL CreateDC(LPCTSTR lpszDriverName,LPCTSTR lpszDeviceName,
LPCTSTR lpszOutput,const void * lpInitData);
为专门设备创建设备场景。
释放掉:BOOL DeleteDC(HDC hdc);
eg.通过调用下面函数获得这个屏幕的设备环境句柄
hdc = CreateDC(Text("DISPLAY"),NULL,NULL,NULL);
5.--使用CreateIC也可取得DC句柄
hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
6.使用位图时,取得一个内存设备环境:
BOOL CreateCompatibleDC(CDC* pDC);
DC属性
在建立一个DC之后,使用ReleaseDC或EndPaint后,对新的设备环境信息的改变会丢失,要使其不变可在登陆窗口类别时:
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
知道窗口被删除,才会丢失。
有时想改变DC属性,然后又想恢复原来的DC。可以使用下面函数保存DC状态:
int SavaDc();
绘图完成后,回到修改属性前存在的设备环境,使用下面函数:
BOOL RestoreDC(int nSavedDC);
图形映射模式
Windows定义了8中映射方式。映射方式定义了图像模式的 逻辑单位和增加方向--MM_TEXT/MM_LOMETRIC/MM_HIMETRIC/...
可以使用下面的方式设定映射的方式:
int SetMapMode(int nMapMode);
获得当前映射方式:
int GetMapMode(void) const;
--------------几乎所有的绘图函数中,坐标值都是使用逻辑单位---------厘米、英寸等。Windows必须将逻辑单位转换为设备单位即像素
Windows默认映射方式为MM_TEXT。这种映射方式下,逻辑单位与实际单位相同,这样可以直接以像素为单位进行操作。
Windows为实现设备点与逻辑点之间的转换提供了两个函数。
设备点转换为逻辑点:
void DPtoLP(LPPOINT lpPoints,int nCount = 1) const;
逻辑点转换为设备点:
void LPtoDP(LPPOINT lpPoints,int nCount = 1) const;
eg.
CRect rect;
GetClientRect(&rect);
pDC->DPtoLP((LPPOINT) &rect,2);