MFC绘图
1.基本概念
Windows提供了一个称为图形设备接口(Graphics Device Interface,GDI)的抽象接口。
GDI 作为Windows的重要组成部分,负责管理用户绘图操作时功能的转换。用户通过调用GDI 函数与设备打交道,GDI 通过不同设备提供的驱动程序将绘图语句转换为对应的绘图指令,避免了用户对硬件直接进行操作,从而实现设备无关性(显示器或打印机)。
应用程序的输出面向设备环境(Device Context,DC),是一个虚拟逻辑设备,也称设备描述表或设备上下文。设备环境DC 是由GDI 创建,用来代表设备连接的数据结构。windows是多任务操作系统,因此,程序A与程序B的输出必须彼此隔离,这意味着各程序的输出必须限制在自己的窗口中.GDI使用设备描述表(DC)这一机制来保证该规则的遵守。
MFC封装了DC,提供CDC 类及它的子类以访问GDI。
CDC类派生自CObject类,其子类包括CClientDC,CPaintDC,CWindowDC,CMetaFileDC。
2.使用
(1)使用SDK函数实现
HDC hdc;
hdc=::GetDC(m_hWnd);
HPEN hpen=CreatePen(PS_SOLID,10,RGB(0,0,255));
HPEN hOldPen=(HPEN)::SelectObject(hdc,hpen);
Rectangle(hdc,0,0,100,100);
::SelectObject(hdc,hOldPen);
::ReleaseDC(m_hWnd,hdc);
第2句是关键,给::GetDC传递的窗口句柄如果是NULL,则表示绘图区域是整个屏幕;
如果是::GetParent(m_hWnd), 则表示绘图区域是框架类的客户区;
如果是m_hWnd,则表示绘图区域是视图类的客户区。
(2)使用CDC类
CDC *pDC=GetDC();
CPen pen(PS_SOLID,10,RGB(0,0,255));
CPen *pOldPen=pDC->SelectObject(&pen);
pDC->Rectangle(0,0,100,100);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
(3)使用CDC的子类
为了避免采取上面这种需要记住获取和释放设备描述表所采用的函数(并且确保使用后释放),MFC提供了一些CDC派生类。如下:
CPaintDC : 用于在客户区画图(仅限于OnPaint处理程序,响应WM_PAINT消息)
CClientDC : 用于客户区画图(OnPaint以外的处理程序使用)
CWindowDC : 用于在窗口任意区内画图(包括客户区)
CMetaFileDC : 用于向GDI元文件画图
CClientDC : 用于客户区画图(OnPaint以外的处理程序使用)
CWindowDC : 用于在窗口任意区内画图(包括客户区)
CMetaFileDC : 用于向GDI元文件画图
以上这些类可以直接进行实例化(在栈中使用),不必担心其释放。
CClientDC dc(this);
CPen pen(PS_SOLID,10,RGB(0,0,255));
CPen *pOldPen=dc.SelectObject(&pen);
dc.Rectangle(0,0,100,100);
dc.SelectObject(pOldPen);