博客已经开了好久了,却一直空着,没有什么动力来写点什么。
最近一直在研究WTL做界面,在网上也找了很多资料,都是左一篇,右一篇的,全部收藏在了有道云笔记里了。
好东西当然不能一个人私藏了,所以想起这个博客来了,希望把WTL的一些心得在这里贡献给大家,也希望大家把相关的链接给我,我整理好之后全部放在这里。
原理性的东西,大家可以查看MFC程序员的WTL指南,在www.codeproject.com可以搜到。我只是想分享一些使用心得。
1、关于消息传递
WTL之中的消息传递可通过代码看明白。
当我们想把菜单的消息传递到MDI的子窗口,可以使用WTL中定义的宏CHAIN_MDI_CHILD_COMMANDS()
菜单消息(WM_COMMAND)传给ChildFrame
用宏 CHAIN_MDI_CHILD_COMMANDS()
BEGIN_MSG_MAP(CMainFrame)
CHAIN_MDI_CHILD_COMMANDS() CHAIN_MSG_MAP(CUpdateUI<CMainFrame>) CHAIN_MSG_MAP(CMDIFrameWindowImpl<CMainFrame>) END_MSG_MAP()
可将消息传给子窗口
CHAIN_MDI_CHILD_COMMANDS()定义如下
// MDI child command chaining macro (only for MDI frame windows) #define CHAIN_MDI_CHILD_COMMANDS() \ if(uMsg == WM_COMMAND) \ { \ HWND hWndChild = MDIGetActive(); \ if(hWndChild != NULL) \ ::SendMessage(hWndChild, uMsg, wParam, lParam); \ }然后子窗口若有View,用宏
CHAIN_CLIENT_COMMANDS()可将消息继续往下传给View(View是子窗口客户区创建的一个覆盖客户区的窗口)
宏定义如下BEGIN_MSG_MAP(CChildFrame) MESSAGE_HANDLER(WM_CREATE, OnCreate) //COMMAND_ID_HANDLER(ID_FILE_SAVE, OnSave) MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg) CHAIN_CLIENT_COMMANDS() CHAIN_MSG_MAP(CMDIChildWindowImpl<CChildFrame>) END_MSG_MAP()
// Client window command chaining macro (only for frame windows) #define CHAIN_CLIENT_COMMANDS() \ if(uMsg == WM_COMMAND && m_hWndClient != NULL) \ ::SendMessage(m_hWndClient, uMsg, wParam, lParam);
如果使用的是SDI的话,可以使用CHAIN_MSG_MAP_ALT_MEMBER()来传递消息的view窗口。