小编Wal*_*.JJ的帖子

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

我使用Visual Studio 2013创建了一个简单的拆分窗口应用程序.有两个视图,一个视图由default-view-class组成,另一个视图由from-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;

}
Run Code Online (Sandbox Code Playgroud)

这个分离器工作正常.

当我尝试将ON_COMMAND处理程序添加到其中一个菜单项时,会出现问题.如果我将ON_COMMAND处理程序放在default-view-class中则没有问题.菜单项点击很好,处理程序工作.

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

我相信我已经做了一切,在我的自定义视图类中正确实现了消息映射.

/////////////////////////
// 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();
};
Run Code Online (Sandbox Code Playgroud)

DECLARE_MESSAGE_MAP()肯定是有在MyCustomView.h当然,我已经添加BEGIN_MESSAGE_MAP,END_MESSAGE_MAP()对在MyCustomView.cpp文件.

/////////////////////////
// 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 …
Run Code Online (Sandbox Code Playgroud)

events mfc handler menuitem message-map

3
推荐指数
1
解决办法
98
查看次数

标签 统计

events ×1

handler ×1

menuitem ×1

message-map ×1

mfc ×1