3

我使用 Visual Studio 2013 制作了一个简单的拆分窗口应用程序。有两个视图,一个视图由 default-view-class 组成,另一个视图由派生自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();
};

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

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

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

请给我一些建议。谢谢你。

4

1 回答 1

5

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

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

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

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

TN021

于 2015-11-26T10:54:18.387 回答