即使添加了ON_COMMAND处理程序,菜单项也会保持禁用状态

时间:2015-11-26 10:08:43

标签: events mfc handler menuitem message-map

我使用Visual Studio 2013创建了一个简单的拆分窗口应用程序。有两个视图,一个视图由default-view-class组成,另一个视图由从{{1创建的自定义视图类组成。 }}。

CScrollView

这个分离器工作正常。

当我尝试向其中一个菜单项添加///////////////////////// // MainFrm.cpp BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext) { split_wnd.CreateStatic(this,1,2); CRect cr; GetClientRect(&cr); split_wnd.CreateView(0,0,RUNTIME_CLASS(CProjectMainView),CSize(cr.Width()/2,cr.Height()),pContext); split_wnd.CreateView(0,1,RUNTIME_CLASS(CMyCustomView),CSize(cr.Width()/2,cr.Height()),pContext); return true; } 处理程序时,会出现问题。如果我将ON_COMMAND处理程序放在default-view-class中则没有问题。菜单项点击很好,处理程序工作。

但是如果我将ON_COMMAND处理程序放在custom-view-class中,则菜单项根本不会启用。

我相信我已经完成了在自定义视图类中正确实现消息映射的所有内容。

ON_COMMAND

///////////////////////// // CMyCustomView.h class CMyCustomView:public CScrollView { public: DECLARE_DYNCREATE(CMyCustomView) CMyCustomView(); ~CMyCustomView(); virtual void OnDraw(CDC* /*pDC*/); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual void OnInitialUpdate(); public: DECLARE_MESSAGE_MAP() afx_msg void OnMenuIdTestMessageMap(); }; 肯定存在于MyCustomView.h中 当然,我在MyCustomView.cpp文件中添加了DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP对。

END_MESSAGE_MAP()

但是,菜单项根本不会启用。它只是保持灰色。

我尽可能地用谷歌搜索,但似乎到目前为止还没有人有这种经历。首先,是否无法将///////////////////////// // CMyCustomView.cpp BEGIN_MESSAGE_MAP(CMyCustomView,CScrollView) ON_COMMAND(MENU_ID_TEST_MESSAGE_MAP,&CMyCustomView::OnMenuIdTestMessageMap) END_MESSAGE_MAP() void CMyCaptureView::OnMenuIdTestMessageMap() { // TODO: Add your command handler code here } 处理程序添加到自定义视图类中?我希望不会。

请给我一些建议。谢谢。

1 个答案:

答案 0 :(得分:5)

原因很简单。命令路由遵循以下规则:

  1. Active View
  2. 文件
  3. DocTemplate
  4. 应用
  5. 在拆分器窗口中没有路由到不同的视图。

    如果您想要不同的行为,请在您的框架中创建一个托管拆分器窗口的OnCmdMsg处理程序。首先将OnCmdMsg调用到活动的拆分器视图,然后将其重新路由到第二个嵌入式视图(如果没有处理)。

    请参阅TN021