WTL中消息映射初级

来源:互联网 发布:apache kylin使用教程 编辑:程序博客网 时间:2024/05/14 16:25

WTL 的消息映射机制和ATL的消息映射机制基本相同,WTL的消息机制的功能是在AtL的基础上加工细化了。都是通过宏定义实现
1:基本结构

BEGIN_MSG_MAP(CMainFrame)        //系统事件消息        MESSAGE_HANDLER(WM_CREATE, OnCreate)        MESSAGE_HANDLER(WM_DESTROY, OnDestroy)        //命令消息,用户触发        COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)        ……        //基类消息,消息链        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)    END_MSG_MAP() //结尾

也有是:

BEGIN_MSG_MAP_EX(……) //开始        MSG_WM_CREATE(OnCreate)        MSG_WM_CONTEXTMENU(OnContextMenu)END_MSG_MAP()//结尾

都是通过BEGIN_MSG_MAP 或者是BEGIN_MSG_MAP_EX开始,END_MSG_MAP()//结尾。中间添加消息映射。
2:内部机制
消息映射的内部机制是由多个队列形式呈现,以msgMapID区分。默认是0,可通过:ALT_MSG_MAP(msgMapID)修改。
即:如果没有ALT_MSG_MAP(msgMapID),那么所有的映射都是在一个队列中。
下列实例:

BEGIN_MSG_MAP(CWtlTest2View)        MESSAGE_HANDLER(WM_PAINT, OnPaint)        //修改 消息映射标识符pMsg,默认为0,此处修改为1        ALT_MSG_MAP(1) // Handle notify message.        COMMAND_ID_HANDLER(ID_ViewAct1, OnViewAct1)    END_MSG_MAP()

目的:读取消息映射标识符pMsg,为1的消息,并处理。这一股于:不同窗口的消息传递。实例

//主窗口有个按钮点击,在子窗口中响应;//主窗口消息映射CWtlTest2View m_view;BEGIN_MSG_MAP(CMainFrame)        ………………              CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)        CHAIN_MSG_MAP_ALT_MEMBER(m_view, 1)  //View中响应:CWtlTest2View,消息映射ID_ViewAct1END_MSG_MAP()//子窗口消息映射BEGIN_MSG_MAP(CWtlTest2View)        MESSAGE_HANDLER(WM_PAINT, OnPaint)        //修改 消息映射标识符pMsg,默认为0,此处修改为1        ALT_MSG_MAP(1) // Handle notify message.        COMMAND_ID_HANDLER(ID_ViewAct1, OnViewAct1)    END_MSG_MAP()

3,内部顺序
内部消息是按顺序进行解析的,如果要将没有匹配到的消息传递给别的类或对象处理,可通过:
CHAIN_MSG_MAP实现,该宏的功能是将消息转到目标类的消息映射处理,如果没有处理的再回来,相当于增加了一个过滤器。CHAIN_MSG_MAP有几种变形:
CHAIN_MSG_MAP(类名),将消息导入其他类处理。一般是原类的基类
CHAIN_MSG_MAP_ALT(类名,number),将消息导入其他类处理,并将消息ID修改(默认是0)。一般是原类的基类
CHAIN_MSG_MAP_ALT_MEMBER(对象, 1),将消息导入特定对象处理,并将消息ID修改(默认是0)。一般用于不同窗口的通信;

//MDI的子窗口的情况
CHAIN_MDI_CHILD_COMMANDS()把所有的菜单的消息传递到MDI的子窗口,使用默认消息ID

CHAIN_CLIENT_COMMANDS()可将消息继续往下传给View处理

//SDI的情况
使用CHAIN_MSG_MAP_ALT_MEMBER()来传递消息的view窗口。

//注意:REFLECT_NOTIFICATION() 反射宏
部分控件需要在消息宏中添加REFLECT_NOTIFICATION()以支持自绘消息。该宏通过参数取得发送事件控件的窗体句柄,并通过该句柄将事件发还给控件.
最后还有一点不是所有的控件都可以用COwnerDraw来自绘控件的,只有5个控件(MENU,LISTBOX,COMBOBOX,BUTTON,STATIC)支持.

欢迎指正!