由前面可知,要使用Win32的GDI绘图函数进行图形的绘制,都需要HDC的句柄来实现。MFC把GDI的绘图函数和HDC的句柄封装进了CDC类中,并且以CDC类为父类派生出了三个子类:CPaintDC、CClientDC、CWindowDC,所以在以后绘图时除了前面讲的直接使用句柄绘图,还可以使用这三个派生类进行绘图操作。这三个派生类分别对应客户区绘图、临时客户区绘图、非客户区绘图。如下图:
在三个CDC的派生类中,只有构造函数和虚构函数,这样可以保证对象在进行构造和虚构时可以成对调用,避免内存泄漏。以CPaintDC()为例,其封装如下:
class CPaintDC::CDC { protected: HWND m_hWnd; PAINTSTRUCT m_ps; public: CPaintDC(CWnd* pWnd) { // m_hDC继承自其父类CDC类中 m_hDC = ::BeginPaint(m_hWnd = pWnd->m_hWnd,&m_ps); } virtual ~CPaintDC() { ::EndPaint(m_hWnd,&m_ps); } };
这样,我们在构造CPaintDC对象时调用 BeginPaint()函数,在对象析构时调用 EndPaint()函数,保证了内存申请和释放,不会泄漏。其它两个派生类也是同样的封装。
使用CPaintDC()等派生类进行绘图的步骤:
1、构造对象 CPaintDC dc(this);
2、绘图操作。
对象析构时自动调用EndPaint()函数