在上一篇,我们已经实现了简单的画线功能,不过我们是用平台SDK的实现的,其实MFC将所有与作图相关的操作封装成了一个类,即CDC。
我们现在来用CDC实现画线。代码如下:
CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
这里的GetDC我们用的是CWnd的成员函数,它的返回值是一个CDC指针。
ReleaseDC也是CWnd的成员函数,它的参数也是一个CDC指针。
在CDC中又有四个派生类,分别为:CClientDC、CWindowDC、CPaintDC和CMetaFileDC。
那我们现在来简单地介绍一下他们,并且用CClientDC、CWindowDC和CPaintDC来实现画线功能。
1、 CClientDC(客户区设备上下文): 处理显示器描述表的相关的窗体客户区域。
用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中调用GetDC,析构函数中调用ReleaseDC。
所以用它来实现画线,代码如下:
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CClientDC的构造函数的参数是CWnd的一个指针,这里我们可以用this指针。
2、CWindowDC:可以访问整个屏幕区域,包括客户区和菲客户区,同样其构造函数中调用GetDC,析构函数中调用ReleaseDC。
所以用它来实现画线,代码如下:
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
3、CPaintDC: 封装BeginPaint和EndPaint两个API的调用。
(1)用于响应窗口重绘消息(WM_PAINT)是的绘图输出。
(2)CPaintDC 在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。
(3)CPaintDC也只能用在WM_PAINT消息处理之中。
所以用它来实现画线,代码如下:
CPaintDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);