首页 理论教育CDC类及其派生类,教你VC++MFC视频教程中的关键要点

CDC类及其派生类,教你VC++MFC视频教程中的关键要点

【摘要】:在MFC封装的三个CDC派生类中,只有构造函数和析构函数两个成员函数,这是一种特殊结构的封装类。以上为CPaintDC类简易的代码结构,通过这个结构可以避免忘记调用EndPaint函数问题。CDC派生类的结构和功能说明见表7-1。表7-1 CDC派生类的结构和功能说明使用MFC应用程序向导创建一个工程名为“xdc”的对话框程序,演示在WM_PAINT消息回调时通过CPaintDC执行标准绘图过程。使用MFC封装类CClientDC对非客户区绘图效率高并且很方便。

在本章第1节中的Win32项目中,展示了一部分GDI函数的调用方法,所有GDI函数都是通过HDC句柄来实现的,包括LineTo、Rectangle和Ellipse等。MFC把几乎全部GDI函数都封装进CDC类中,核心是HDC类型的类成员变量m_hDC,所有成员函数都是围绕这个核心句柄展开的。

在MFC封装的三个CDC派生类中,只有构造函数和析构函数两个成员函数,这是一种特殊结构的封装类。目的主要是利用对象构造和析构时,可以自动成对调用函数。例如,BeginPaint和EndPaint必须成对使用,一旦忘记调用EndPaint就可能造成内存泄漏。

978-7-111-46378-8-Chapter07-20.jpg

978-7-111-46378-8-Chapter07-21.jpg

以上为CPaintDC类简易的代码结构,通过这个结构可以避免忘记调用EndPaint函数问题。因为一个类对象在进入函数时被构造,当离开函数时就必然会执行析构。CClientDC和CWindowDC类也是同样架构,类内只有构造函数和析构函数两个成员函数。CDC派生类的结构和功能说明见表7-1。

表7-1 CDC派生类的结构和功能说明

978-7-111-46378-8-Chapter07-22.jpg

使用MFC应用程序向导创建一个工程名为“xdc”的对话框程序,演示在WM_PAINT消息回调时通过CPaintDC执行标准绘图过程。

1)修改主对话框类中WM_PAINT消息回调函数OnPaint的代码。

978-7-111-46378-8-Chapter07-23.jpg

2)编译并运行,测试代码。

MFC封装类CPaintDC的优点是,比Win32模式编码效率高并且可读性好。CPaintDC构造时自动调用BeginPaint函数,离开OnPaint函数时自动在CPaintDC的析构函数中调用EndPaint函数。

3)在主对话框类中,添加WM_NCPAINT消息映射函数OnNcPaint,如图7-12所示(注意,在Filter中选择Window过滤器)。

978-7-111-46378-8-Chapter07-24.jpg(www.chuimin.cn)

图7-12 添加WM_NCPAINT消息映射函数

4)修改OnNcPaint消息映射函数代码。

978-7-111-46378-8-Chapter07-25.jpg

5)编译并运行,测试代码。

使用MFC封装类CWindowDC对非客户区绘图效率高并且很方便。CWindowDC构造时自动调用GetWindowDC函数,在析构函数中自动调用ReleaseDC函数。

6)在主对话框类中添加WM_LBUTTONDOWN消息映射函数,如图7-13所示。

978-7-111-46378-8-Chapter07-26.jpg

图7-13 添加WM_LBUTTONDOWN消息映射函数

7)修改刚添加的消息映射函数代码。

978-7-111-46378-8-Chapter07-27.jpg

8)编译并运行,测试代码。

使用MFC封装类CClientDC对非客户区绘图效率高并且很方便。CClientDC构造时自动调用GetDC函数,析构时自动调用ReleaseDC函数。