CToolBar的ON_COMMAND消息

chenweiye120 2011-06-28 11:53:54
鄙人看了N多书籍和资料都说当用户按下工具栏上的按钮时会给工具栏的父窗口发送一个WM_COMMAND消息,但是在MFC单文档程序中,工具栏停靠时CToolBar的父窗口是CDockBar,后者的父窗口是CMainFrame,工具栏浮动时父窗口也是CDockBar,后者的父窗口是CMiniFrameWnd。但我调试时发现当按下工具栏按钮时CToolBar接受到WM_LBUTTONUP消息后交由其默认的窗口过程处理后发送出了一个WM_COMMAND消息,问题来了:不管工具栏是否停靠,他的直接父窗口并不是CMainFrame,但此时WM_COMMAND消息中的目标窗口就是CMainFrame(已通过SPY++查看窗口句柄得知),即CMainFrame获得了WM_COMMAND的分发权。
我想问的是工具栏的WM_COMMAND消息不是应该发送给CDockBar(它的直接父窗口)吗,怎么发送给了CMainFrame呢,我观察调用堆栈也没发现CDockBar把WM_COMMAND消息转交给CMainFrame呀,到底工具栏的窗口过程会给哪个所谓的父窗口发送WM_COMMAND消息呢,大家多多发言,言者有分。
...全文
159 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenweiye120 2011-06-29
  • 打赏
  • 举报
回复
小弟明天有工作,晚上结贴,大家多多帮忙哦。
kyotrue 2011-06-29
  • 打赏
  • 举报
回复
CToolBar的父类CControlBar中定义了成员变量:
CFrameWnd* m_pDockSite;
这个才是它Send WM_COMMAND的目的地
chenweiye120 2011-06-29
  • 打赏
  • 举报
回复
今天看了一下MFC源码无意间发现TB_SETPARENT消息,位于CToolBar的SetOwner里面,一下子豁然开朗~
原来父窗口与接受工具栏通告消息的窗口毫无关系,只是有时候两者一样而已。
创建工具栏时指定的父窗口为通告消息的接受者,不管后面是否用了::SetParent改变父窗口,接受通告消息的窗口不变,想改变接受通告消息的窗口需要发送TB_SETPARENT消息,所以工具栏通告消息的接受者一直是CMainFrame,不曾改变,通过发送TB_SETPARENT消息测试,果然不出所料。
当我把通告消息的接受者改为多文档窗口中的子框架窗口时,主框架窗口果然没有响应了。感谢大家的回答,结贴了。
Eleven 2011-06-29
  • 打赏
  • 举报
回复
WM_COMMAND Notification
--------------------------------------------------------------------------------
The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.
「已注销」 2011-06-29
  • 打赏
  • 举报
回复
view类好像也可以接收这个消息


15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧