http://hi.baidu.com/lanlandejuzi/item/815e9216ee7f6b5af0090ef3
什么是 GDI ?
GDI全称是Graphics Device Interface(图形设备接口)。它负责Windows中的图形输出。在使用GDI编程时,我们需要一个设备描述表对象。这个对象的基类在MFC中声明为CDC,
如DrawText()函数即是该类的一个成员函数。MFC提供了若干有用的CDC派生类,如我们已经见到过的CPaintDC类。在绘制图形时,Windows并不是把所有的像素都直接输出到平面上,而是先将这些像素输出到设备描述表中,然后再通过设备描述表来最终向输出设备中绘制图形。
设备描述上下文(设备描述表)
在MFC中获取设备描述上下文的标准方法是使用CWnd::GetDC();方法。在绘制完毕时要使用ReleaseDC()释放该上下文。如下:
CDC* pDC = GetDC();
//使用pDC完成绘制工作
ReleaseDC(pDC);
标准的CDC对象是不能通过定义或new操作符自己创建出来的,必须从系统环境中获取。
如果是在OnPaint()函数中使用设备上下文,则可以使用BeginPaint()和EndPaint()函数。但是这里需要提供一个PAINTSTRUCT类型的参数用于获取系统相关信息。如下:
PAINTSTRUCT ps;
CDC* pDC = BeginPaint(&ps);
//使用pDC完成绘制工作
EndPaint(&ps);
MFC提供了若干个CDC类的派生类,如表所示:
类名 描述
CPaintDC 用于在窗口客户区画图(仅限于OnPaint处理程序)
CClientDC 用于在窗口客户区画图(除OnPaint外的任何处理程序)
CWindowDC 用于在窗口内任意地方画图,包括非客户区
CMetaFileDC 用于向GDI元文件画图
对于CPaint这些已经被封装好的类,我们在使用时不需再调用ReleaseDC()函数。这些对象在被系统销毁调用其析构函数时即会自动释放设备描述表。对于在函数中定义的普通变量如:
CPaintDC dc(this);
在退出函数时,其所在的栈内存被回收,dc对象的析构函数被调用,所以其设备描述表句柄被释放。
对于CPaintDC之类的指针变量,则需要使用delete操作符将其显示的回收。
如CPaintDC* pDC = new CPaintDC(this);
delete pDC;
CPaintDC 类
CPaintDC类响应WM_PAINT消息,但只能在OnPaint()函数中使用。
CClientDC和CWindowDC类
CClientDC类是用于OnPaint()方法之外的。用法与CPaintDC类似。
CWindowDC类所含的窗口区域包括了窗口边框这内的所有内容。
如果对CClientDC对象或是CWindowDC对象初始化时提供了NULL参数,则会在当前的桌面屏幕上绘制图形。
设备描述上下文属性
们所做的所有绘图工作中并不包括颜色、背景等的操作。这些操作都在设备上下文中被描述,我们可以通过对当前的设备上下文对象设置这些操作,从而完成颜色之类的变化。主要的设备描述上下文属性如下表所示:
属性 默认值 设值方法 取值方法
文本颜色 Black CDC::SetTextColor CDC::GetTextColor
背景颜色 White CDC::SetBkColor CDC::GetBkColor
背景模式 OPAQUE CDC::SetBkMode CDC::GetBkMode
映射模式 MM_TEXT CDC::SetMapMode CDC::GetMapMode
绘图模式 R2_COPYPEN CDC::SetROP2 CDC::GetROP2
当前位置 (0,0) CDC::MoveTo CDC::GetCurrentPosition
当前画笔 BLACK_PEN CDC::SelectObject CDC::SelectObject
当前画刷 WHITE_BRUSH CDC::SelectObject CDC::SelectObject
当前字体 SYSTEM_FONT CDC::SecletObject CDC::SelectObject
映射模式
不同的映射模式下一个单位所代表的实际长度是不一样的。在默认的MM_TEXT映射模式下,一个单位恰好表示一个像素,而在MM_LONGENGLISH映射模式下,一个单位代表百分之一英寸。
下表显示了8种不同的映射模式:
映射模式 一个逻辑单位对应的距离 X和Y轴的方向
MM_TEXT 1像素 +x,+y
MM_LOMETRIC 0.1mm +x,-y
MM_HIMETRIC 0.01mm +x,-y
MM_LOENGLISH 0.01in +x,-y
MM_HIENGLISH 0.001in +x,-y
MM_TWIPS 1/1440in(0.0007in) +x,-y
MM_ISOTROPIC 用户自定义(x和y同等缩放) 用户自定义
MM_ANISOTROPIC 用户自定义(x和y独立缩放) 用户自定义
使用CDC::SetMapMode可以改变默认的映射模式。
获取设备信息
使用CDC::GetDeviceCaps()函数可以获得系统的设备信息
获得字体信息
GetTextMetrics
用于得到被定义的系统数据或者系统配置信息.
GetSystemMetrics ()