【问题标题】:Menu item keeps disabled even after ON_COMMAND handler is added即使添加了 ON_COMMAND 处理程序,菜单项仍保持禁用状态
【发布时间】:2016-02-29 09:07:51
【问题描述】:

我使用 Visual Studio 2013 制作了一个简单的拆分窗口应用程序。有两个视图,一个视图由 default-view-class 组成,另一个视图由派生自 CScrollView 的 custom-view-class 组成.

/////////////////////////
// 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
}

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

我已尽我所能在 Google 上搜索,但似乎到目前为止还没有人有过这种经历。首先是否不可能将ON_COMMAND 处理程序添加到自定义视图类?我希望不会。

请给我一些建议。谢谢。

【问题讨论】:

    标签: events mfc handler menuitem message-map


    【解决方案1】:

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

    1. 框架
    2. 活动视图
    3. 文档
    4. 文档模板
    5. 应用

    没有路由到拆分器窗口中的不同视图。

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

    TN021

    【讨论】:

    • 哇。谢谢你。没想到答案来得这么快。太感谢了。我会按照你说的试试。我真的希望找到解决办法。
    • 但令人失望的是,命令路由的限制如此之大。
    • 它受到限制但有据可查... ;) TN021 msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2013-01-11
    • 2021-12-13
    • 1970-01-01
    • 2019-12-05
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多