不同视图类之间的命令消息传递
来源:互联网 发布:学编程济南 编辑:程序博客网 时间:2024/05/29 13:17
我们先看看VC课上学的命令消息传递的路线:
命令消息接收者的类型 处理次序 Frame窗口
1.View2.Frame窗口本身3.CWinApp对象
View 1.View本身2.Document Document 1.Document本身2.Document Template
前几天在我的科技创新项目中遇到了这样的问题:用资源编辑器在菜单栏中添加了一个菜单项,并在一个右视图类中添加了消息响应,但是程序运行时,那个菜单项不可用;而在另外一个左视图类中添加消息响应时没有出现问题。
我的界面设计成静态切分窗口,左视图派生自CTreeView,右视图派生自CFormView;右视图类是在AppWizard中添加的,左视图类是我自己在创建切分窗口的代码中添加的:
if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CWellTreeView), CSize(150, 100), pContext) || !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CWellFormView), CSize(200, 100), pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; } return TRUE;
我原本以为在AppWizard中添加的类会首先接收到命令消息,但结果却不是那样,因此我判断第一个被创建的视图首先接受到命令消息,也就是说本该CWellFormView接收的命令消息被CWellTreeView “拦截”了,类似于Frame窗口接收的命令消息被View“拦截”。View“拦截”Frame的消息是怎么实现的呢?让我们看看MFC原始码:
BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo){ CPushRoutingFrame push(this);
// pump through current view FIRST CView* pView = GetActiveView(); if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE;
// then pump through frame if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE;
// last but not least, pump through app CWinApp* pApp = AfxGetApp(); if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE;
return FALSE;}
这样,我遇到的问题就迎刃而解了,我们可以向MFC学习,在CWellTreeView中重写虚函数OnCmdMsg,添加很简单的一段代码即可:
BOOL CWellTreeView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // TODO: Add your specialized code here and/or call the base class CWellListView* listview=(CWellListView*)GetView(RUNTIME_CLASS(CWellListView)); if(listview!=NULL && listview->OnCmdMsg(nID,nCode,pExtra,pHandlerInfo)) return TRUE; return CTreeView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);}
接下来,CWellListView就可以响应命令消息了。嘿嘿,有点成就感!
要注意的是这两个View是不同的类,如果你做一个切分窗口两个VIew相同,就不存在视图之间的命令消息传递了!
- 不同视图类之间的命令消息传递
- MFC在不同的类窗体之间传递消息
- android 不同进程之间的消息传递
- CSplitterWnd分割的两个视图之间的消息传递
- CSplitterWnd分割的两个视图之间的消息传递收藏
- Unity事件管理类,用于不同对象之间传递消息
- 线程之间消息的传递
- 利用消息通知中心CCNotificationCenter来传递不同层之间的数据
- java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]
- 视图之间的数据传递 ios
- 视图之间的数据传递 ios
- UI - 视图控制器之间的值传递
- 视图控制器ViewControllers之间的数据传递
- 不同Activity之间的数据传递
- 不同Activity之间的数据传递
- 不同Activity之间的数据传递
- C#不同窗体之间的数据传递
- 不同Activity之间的数据传递
- 美媒:CNN风波可能成为一个时代的指标
- 进销存软件之OO设计--中间层处理(一)
- 破解本地的mysql用户名和密码
- P6SPY使用问题解决
- 读者盛赞Inside VCL,李维一一作答
- 不同视图类之间的命令消息传递
- 使用Jmeter对Mysql进行压力测试无法执行多条sql语句问题
- 机会是什么?
- 绑架窗体之Delphi版
- 我的MYSQL的简明安装方法!
- 怎样向SQL Server插入带有Image字段的记录
- 优化php的40条建议(转)
- (X)HTML的文档结构
- PeekinginMySQL5.0alphaEnterpriseFunctional<Function&Procedure>