【发布时间】: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_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
}
但是,菜单项根本不会启用。它只是保持灰色。
我已尽我所能在 Google 上搜索,但似乎到目前为止还没有人有过这种经历。首先是否不可能将ON_COMMAND 处理程序添加到自定义视图类?我希望不会。
请给我一些建议。谢谢。
【问题讨论】:
标签: events mfc handler menuitem message-map