不同视图类之间的命令消息传递

来源:互联网 发布:学编程济南 编辑:程序博客网 时间: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相同,就不存在视图之间的命令消息传递了!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 qq群解散了照片怎么办 出租屋没窗户很闷怎么办 二手房交税后房主不卖怎么办 二房东收不到租拖欠房租怎么办 房东不给换门锁怎么办 租房到期房东联系不到租客怎么办 廉租房名下有车怎么办 路边停车收忘记交费怎么办 考编忘记交费了怎么办 深圳公租房入库了接下来怎么办 公租房5年以后怎么办 教务系统密码忘记了怎么办 林科大教务处密码忘记了怎么办 智学号密码忘了怎么办 正方教务管理系统忘记密码怎么办 正方教务系统忘记密码怎么办 教务网密码忘了怎么办 电动车解除限速报警器不响怎么办 公租房住满5年怎么办 广州公租房收入超标怎么办 深圳法院拍卖房子不肯搬走怎么办 上海奉贤公租房的期满怎么办 公租房人口少了怎么办 公租房太远了怎么办 商品房没有门厅业主该怎么办 公帐付款备注错了怎么办 我是农村户口在外省交社保怎么办 北京租房遇到黑中介怎么办 上海租房子不让带孩子怎么办 租的房子没窗户怎么办 北京安河桥安河家园租房被骗怎么办 领完失业金后怎么办 北京公租房太小怎么办 申请公租房太小怎么办 房东电费收贵了怎么办 申请公租房工资超了怎么办 重庆公租房工资超了怎么办 公租房申请父母房子贷款怎么办 公产房父母去世办公证怎么办 动迁过程中承租人去世了怎么办 公租房的房间带阳台怎么办