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



我使用Visual Studio 2013制作了一个简单的拆分窗口应用程序。有两个视图,一个视图由默认视图类组成,另一个视图则由派生自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处理程序添加到其中一个菜单项时,就会出现问题。如果我把ON_COMMAND处理程序放在默认视图类中,就没有问题。菜单项点击良好,处理程序正常工作。

但是,如果我将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();
};

DECLARE_MESSAGE_MAP()肯定在MyCustomView.h中当然,我在MyCustomView.cpp文件中添加了BEGIN_MESSAGE_MAPEND_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
}

但是,菜单项仍然不会被启用。它只是保持灰色。

我已经尽我所能在谷歌上搜索了,但到目前为止似乎没有人有过这种经历。难道一开始就不可能将ON_COMMAND处理程序添加到自定义视图类中吗?我希望不会。

请给我一些建议。谢谢。

原因很简单。命令路由遵循以下规则:
  1. 框架
  2. 活动视图
  3. 文件
  4. DocTemplate
  5. 应用程序

拆分器窗口中没有路由到其他视图。

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

参见TN021

相关内容

  • 没有找到相关文章

最新更新