第4节 窗口颜色控制
父窗口和控件子窗口的颜色控制,主要有以下3种方法。
1)调用CWinApp::SetDialogBkColor函数,设置对话框背景颜色和静态文本颜色。
2)WM_ERASEBKGND的消息映射函数颜色控制的对象,只包括父窗口自身的背景和文字颜色。
3)WM_CTLCOLOR的消息映射函数颜色控制的对象,不但包括父窗口自身的背景和文字颜色,而且还包括静态文本控件、编辑控件以及组合控件等。
打开本章第3节的“Si”工程,本节将继续演示使用一些简单的对话框及控件的颜色控制。
1)修改进程启动时的回调函数InitInstance的代码。

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

图10-17 查看运行结果
CWinApp::SetDialogBkColor函数的颜色控制的对象,只包括对话框背景颜色和静态文本控件的文字颜色。其他类型控件(包括编辑框和按钮等),都不在它的管理范围内。
3)在主对话框中,添加WM_ERASEBKGND的消息映射函数OnEraseBkgnd,如图10-18所示。

图10-18 添加WM_ERASEBKGND消息映射函数
4)修改OnEraseBkgnd函数的代码。

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

图10-19 查看运行结果(https://www.daowen.com)
WM_ERASEBKGND的消息映射函数颜色控制的对象,只包括父窗口自身的背景和文字颜色。任何控件子窗口,包括静态文本控件等都不在它的控制范围内。
6)添加WM_CTLCOLOR的消息映射函数OnCtlColor,并修改代码。

7)编译并运行,测试代码,如图10-20所示。
所有静态文本控件、编辑框以及组合控件,背景颜色都更新为蓝色,文字颜色也更新为绿色。只有对话框背景还是受OnEraseBkgnd函数控制,仍然还是青色。另外,按钮和列表控件等高级控件不受OnCtlColor函数控制保持原有颜色。

图10-20 查看运行结果
8)再次修改OnCtlColor函数的代码。


9)修改OnEraseBkgnd函数代码为默认处理,或者删除OnEraseBkgnd函数。


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

图10-21 查看运行结果
WM_CTLCOLOR的消息映射函数颜色控制的对象,不但包括父窗口自身的背景和文字颜色,而且还包括静态文本控件、编辑控件以及组合框内部的列表框等。根据OnCtlColor函数的第二个参数,还可以区分不同控件或者窗口,设定不同的背景颜色和文字颜色。颜色控制消息的不足之处是,只能控制比较基础的控件,对于大部分控件还是不能控制(例如,按钮、列表控件等不能控制)。