够正确反 映系统颜色的变化,MFC应用程序可以在WM_SYSCOLORCHANGE消息中调用 Ctl3dColorChange函数。
2. 在MFC应用程序的CWinApp类中的ExitInstance函数中调用Ctl3dUnregister函 数,以方便Windows对CTL3D库的正确管理。
3. 在MFC应用程序的项目文件中加入CTL3D.LIB(可以用IMPORT.EXE产生)。 使用上述CTL3D的自动子类化的机制可以大大简化使用3D控制,如果这不满足你的要 求,那么你就必须单独在需要使用3D控制的对话框的OnInitDialog()中自行子类化
相关的控制类了,典型的如下代码片断所示:
BOOL CMyDialog::OnInitDialog()
{
Ctl3dSubclassDlgEx(m_hWnd,CTL3D_ALL);
return TRUE;
}
上面讲了在对话框中使用3D效果的办法,如果用户想在非对话框中使用3D控制,典 型的在FormView导出类中使用,可以在导出类的OnInitialUpdate函数中进行适当修 改,修改的大小取决于你是否使用了3D控制的自动子类化机制。如果使用前面提到 的自动子类化方法,那么仅需要在相应的OnInitialUpdate函数中调用 Ctl3dSubclassDlg函数了,如下代码片断所示:
void CMyView::OnInitialUpdate()
{
Ctl3dSubclassDlg(m_hWnd,CTL3D_ALL);
}
否则,则需要修改如下:
void CMyView::OnInitialUpdate()
{
Ctl3dSubclassDlgEx(m_hWnd,CTL3D_ALL);
}
六、使用自定义消息
1、MFC的消息映射机制
Windows是一个典型的消息驱动的操作系统,程序的运行是靠对各种消息的响应来实 现的,这些消息的来源非常广泛,既包括Windows系统本身,如WM_CLOSE、 WM_PAINT、WM_CREATE和WM_TIMER等常用消息,又包括用户菜单选择、键盘加速 键以及工具条和对话框按钮等等,如果应用程序要与其它程序协同工作,那么消息的来 源还包括其它应用程序发送的消息,串行口和并行口等硬件发送的消息等等。总
之,Windows程序的开发是围绕着对众多消息的合理响应和实现来实现程序的各种功 能的。使用过C语言来开发Windows程序的人都知道,在Windows程序的窗口回调函数 中需要安排Switch语句来响应大量的消息,同时由于消息的间断性使得不同的消息 响应之间信息的传递是通过大量的全局变量或者静态数据来实现的。 人们常用的两种类库OWL和MFC都提供了消息映射机制用以加速开发速度,使用者只 需要按规定定义好对应消息的处理函数自身即可,至于实际调用由类库本身所提供 的机制进行,或采用虚函数,或采用消息映射宏。为了有效节约内存,MFC并不大量 采用虚函数机制,而是采用宏来将特定的消息映射到派生类中的响应成员函数。这 种机制不但适用于Windows自身的140条消息,而且适用于菜单命令消息和按钮控制 消息。MFC提供的消息映射机制是非常强大的,它允许在类的各个层次上对消息进行 控制,而不简单的局限于消息产生者本身。在应用程序接收到窗口命令时,MFC将按 如下次序寻找相应的消息控制函数:
SDI应用
MDI应用
视口
视口
文档
文档
SDI主框架
MDI子框架
应用
MDI主框架
应用
大多数应用对每一个命令通常都只有一个特定的命令控制函数,而这个命令控制函 数也只属于某一特定的类,但是如果在应用中对同一消息有多个命令控制函数,那 么只有优先级较高的命令控制函数才会被调用。为了简化对常用命令的处理,MFC在 基类中提供并实现了许多消息映射的入口,如打印命令,打印预览命令,退出命令 以及联机帮助命令等,这样在派生类中就继承了所有的基类中的消息映射函数,从 而可以大大简化编程。如果我们要在自己派生类中实现对消息的控制,那么必须在 派生类中加上相应的控制函数和映射入口。
2、使用自己的消息
在程序设计的更深层次,人们常常会发现只依赖于菜单和命令按钮产生的消息是不 够的,常常因为程序运行的逻辑结构和不同视口之间数据的同步而需要使用一些自 定义的消息,这样通过在相应层次上安排消息响应函数就