您的位置:首页 > 其它

WTL中消息映射初级

2017-06-23 11:34 246 查看
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_ViewAct1
END_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)支持.

欢迎指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  atl WTL-消息