WEB开发网
开发学院软件开发VC MFC教程(4)-- 消息映射的实现(2) 阅读

MFC教程(4)-- 消息映射的实现(2)

 2010-03-25 20:33:48 来源:WEB开发网   
核心提示:消息反射(1)消息反射的概念前面讨论控制通知消息时,曾经多次提到了消息反射,MFC教程(4)-- 消息映射的实现(2)(11),MFC提供了两种消息反射机制,一种用于OLE控件,例如处理WM_HSCROLL的反射消息,选择映射消息“=EN_HSC ROLL”,一种用于Windows控制窗口,这里

消息反射

(1)消息反射的概念

前面讨论控制通知消息时,曾经多次提到了消息反射。MFC提供了两种消息反射机制,一种用于OLE控件,一种用于Windows控制窗口。这里只讨论后一种消息反射。

Windows控制常常发送通知消息给它们的父窗口,通常控制消息由父窗口处理。但是在MFC里头,父窗口在收到这些消息后,或者自己处理,或者反射这些消息给控制窗口自己处理,或者两者都进行处理。如果程序员在父窗口类覆盖了通知消息的处理(假定不调用基类的实现),消息将不会反射给控制子窗口。这种反射机制是MFC实现的,便于程序员创建可重用的控制窗口类。

MFC的CWnd类处理以下控制通知消息时,必要或者可能的话,把它们反射给子窗口处理:

WM_CTLCOLOR,

WM_VSCROLL,WM_HSCROLL,

WM_DRAWITEM,WM_MEASUREITEM,

WM_COMPAREITEM,WM_DELETEITEM,

WM_CHARTOITEM,WM_VKEYTOITEM,

WM_COMMAND、WM_NOTIFY。

例如,对WM_VSCROLL、WM_HSCROLL消息的处理,其消息处理函数如下:

void CWnd::OnHScroll(UINT, UINT, CScrollBar* pScrollBar)

{

//如果是一个滚动条控制,首先反射消息给它处理

if (pScrollBar != NULL && pScrollBar->SendChildNotifyLastMsg())

return; //控制窗口成功处理了该消息

Default();

}

又如:在讨论OnCommand和OnNofity函数处理通知消息时,都曾经指出,它们首先调用ReflectLastMsg把消息反射给控制窗口处理。

为了利用消息反射的功能,首先需要从适当的MFC窗口派生出一个控制窗口类,然后使用ClassWizard给它添加消息映射条目,指定它处理感兴趣的反射消息。下面,讨论反射消息映射宏。

上述消息的反射消息映射宏的命名遵循以下格式:“ON”前缀+消息名+“REFLECT”后缀,例如:消息WM_VSCROLL的反射消息映射宏是ON_WM_VSCROLL_REFECT。但是通知消息WM_COMMAND和WM_NOTIFY是例外,分别为ON_CONTROL_REFLECT和ON_NOFITY_REFLECT。状态更新通知消息的反射消息映射宏是ON_UPDATE_COMMAND_UI_REFLECT。

消息处理函数的名字和去掉“WM_”前缀的消息名相同 ,例如WM_HSCROLL反射消息处理函数是Hscroll。

消息处理函数的原型这里不一一列举了。

这些消息映射宏和消息处理函数的原型可以借助于ClassWizard自动地添加到程序中。ClassWizard添加消息处理函数时,可以处理的反射消息前面有一个等号,例如处理WM_HSCROLL的反射消息,选择映射消息“=EN_HSC ROLL”。ClassWizard自动的添加消息映射宏和处理函数到框架文件。

上一页  6 7 8 9 10 11 12 13 14 15 16  下一页

Tags:MFC 教程 消息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接