首页 理论教育WM_DRAWITEM和WM

WM_DRAWITEM和WM

【摘要】:在一些具有自绘属性的列表类控件添加列表项时,产生WM_MEASUREITEM消息回调。在消息回调函数OnMeasureItem中,执行基类函数CWnd::OnMeasureItem将回调路由,进入每个自绘子窗口关联的派生类的虚函数MeasureItem中。使用MFC应用程序向导创建一个工程名为“dr”的对话框程序,用于演示WM_DRAWITEM和WM_MEASUREITEM消息的使用方法。9)在主对话框中,添加WM_DRAWITEM和WM_MEASUREITEM消息映射函数,如图10-46所示。11)修改WM_DRAWITEM消息映射函数代码。WM_MEASUREITEM和WM_DRAWITEM消息,能够在父窗口中提前截获所有子窗口的自绘和测量消息回调。

WM_DRAWITEM消息,一般用于在父窗口中建立消息映射函数。如果父窗口中有一个或多个具有自绘属性的控件,WM_PAINT消息映射函数执行后就立即执行WM_DRAWITEM的消息映射函数OnDrawItem,对所有具有自绘属性的子窗口进行更新。执行基类函数CWnd::OnDrawItem将回调路由,进入每个自绘子窗口关联的派生类的虚函数DrawItem中。

WM_MEASUREITEM消息,同样一般在父窗口中建立消息映射函数。在一些具有自绘属性的列表类控件添加列表项时,产生WM_MEASUREITEM消息回调。在消息回调函数OnMeasureItem中,执行基类函数CWnd::OnMeasureItem将回调路由,进入每个自绘子窗口关联的派生类的虚函数MeasureItem中。

使用MFC应用程序向导创建一个工程名为“dr”的对话框程序,用于演示WM_DRAWITEM和WM_MEASUREITEM消息的使用方法。

1)在主对话框中添加一些控件,如图10-44所示。

978-7-111-46378-8-Chapter10-94.jpg

图10-44 编辑主对话框资源

2)修改控件(自绘)属性,见表10-2。

表10-2 主对话框的控件属性

978-7-111-46378-8-Chapter10-95.jpg

3)将上一个工程的图标复制到res子目录中,并导入到工程里,如图10-45所示。

978-7-111-46378-8-Chapter10-96.jpg

图10-45 导入后的图标资源ID

4)在主对话框类的头文件中,添加一些成员变量和函数。

978-7-111-46378-8-Chapter10-97.jpg

5)在主对话框类的源文件(drDlg.cpp)中编写按钮自绘函数的代码。

978-7-111-46378-8-Chapter10-98.jpg

978-7-111-46378-8-Chapter10-99.jpg

6)在主对话框类的源文件中,编写自绘组合控件的代码。

978-7-111-46378-8-Chapter10-100.jpg(www.chuimin.cn)

978-7-111-46378-8-Chapter10-101.jpg

7)在主对话框类的源文件中,编写添加下拉列表项的代码。

978-7-111-46378-8-Chapter10-102.jpg

8)修改对话框初始化函数OnInitDialog的代码。

978-7-111-46378-8-Chapter10-103.jpg

9)在主对话框中,添加WM_DRAWITEM和WM_MEASUREITEM消息映射函数,如图10-46所示。

978-7-111-46378-8-Chapter10-104.jpg

图10-46 添加消息映射函数

10)修改WM_MEASUREITEM消息映射函数代码。

978-7-111-46378-8-Chapter10-105.jpg

11)修改WM_DRAWITEM消息映射函数代码。

978-7-111-46378-8-Chapter10-106.jpg

12)最后添加WM_DESTROY消息映射函数OnDestroy,并修改代码。

978-7-111-46378-8-Chapter10-107.jpg

13)编译并运行,测试代码,如图10-47所示。

WM_MEASUREITEM和WM_DRAWITEM消息,能够在父窗口中提前截获所有子窗口的自绘和测量消息回调。如果使用这两种消息,还能够省略子窗口派生类,在父窗口中统一编写所有子窗口的自绘代码。这样处理的优点是方便快捷,省略了一些复杂的过程;缺点是不如派生类代码的独立性强,不利于深入推进项目开发。

978-7-111-46378-8-Chapter10-108.jpg

图10-47 查看运行结果