使用 MFC(Visual Studio) 处理视图类中的菜单选择

Posted

技术标签:

【中文标题】使用 MFC(Visual Studio) 处理视图类中的菜单选择【英文标题】:Handling Menu Selection from View Class with MFC(Visual Studio) 【发布时间】:2014-03-09 18:09:14 【问题描述】:

我正在使用 Visual Studio 和 MFC 编写一个程序,当按下相应的菜单按钮时,该程序将从用户那里获取鼠标输入来绘制多边形并将其裁剪到矩形上。我的问题是,用户输入和绘图在视图类(确切地说是 CCssample1View)中处理,而菜单在 CMainFram 类中。即使我在 CCssample1View 中定义 OnMenuSelect 函数,选择菜单按钮时也不会收到通知。

有没有办法将菜单按钮与视图类相关联,以便在按下它们时通知视图类的 OnMenuSelect 函数,而不是通知 Main Frame 的 OnMenuSelect 函数?或者有其他方法可以解决这个问题吗?

附:大约 6 小时前,我确实开始使用 Visual Studio、MFC OpenGL,所以我可能理解了一些严重错误。

更新:

这是视图的消息映射:

BEGIN_MESSAGE_MAP(CCssample1View, CView)


//AFX_MSG_MAP(CCssample1View)
        ON_WM_CREATE()
        ON_WM_DESTROY()
        ON_WM_LBUTTONDOWN()
        ON_WM_LBUTTONUP()
        ON_WM_MOUSEMOVE()
        ON_WM_SIZE()
        ON_COMMAND(ID_DBL_BUF, OnDblBuf)
        ON_COMMAND(ID_NO_DBL_BUF, OnNoDblBuf)
        //AFX_MSG_MAP
        // Standard printing commands
        ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
        ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
        ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
        ON_WM_MENUSELECT()
    END_MESSAGE_MAP()

和主框架:

 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //AFX_MSG_MAP(CMainFrame)
        // NOTE - the ClassWizard will add and remove mapping macros here.
        //    DO NOT EDIT what you see in these blocks of generated code !
    ON_WM_CREATE()
    //AFX_MSG_MAP
    END_MESSAGE_MAP()

菜单的创建(在主框架的 OnCreate 函数中):

CMenu *menu = new CMenu;
menu->CreateMenu();
menu->AppendMenuA(MF_STRING, 2002, "Clip");
SetMenu(menu);

最后,视图的事件处理程序:

void CCssample1View::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)

    CView::OnMenuSelect(nItemID, nFlags, hSysMenu);
    while(1);
    // TODO: Add your message handler code here

不过,当我按下菜单按钮时,什么也没有发生(我的意思是程序在没有无限循环生效的情况下继续运行)。我做错了什么?

【问题讨论】:

【参考方案1】:

为什么要使用 WM_MENUSELECT? WM_MENUSELECT 仅发送到保存菜单的主框架。永远不会路由此 Windows 消息。

改为使用 WM_COMMAND (ON_COMMAND) 处理程序。 WM_COMMAND 处理程序根据此文档http://msdn.microsoft.com/en-us/library/shfzay75.aspx 和此http://msdn.microsoft.com/en-us/library/xt2c310k.aspx 路由通过视图、框架、文档和应用程序对象

如果您想为更多命令项添加处理程序,您可以使用 ON_COMMAND_RANGE 等。

PS:您的代码中已经有 ON_COMMAND 处理程序!

【讨论】:

我对命令一无所知。感谢您指出。我添加了命令函数,问题就消失了。【参考方案2】:

菜单命令可以在主框架、视图或文档中处理。只需在消息映射中为要处理消息的类添加适当的条目。每个命令只能在一个地方处理,因此如果您在主框架中已经有一个消息映射条目并且不想处理它,请从主框架消息映射中删除该行。

【讨论】:

我试过了,但它似乎不起作用。我在 OP 中添加了相关的代码。

以上是关于使用 MFC(Visual Studio) 处理视图类中的菜单选择的主要内容,如果未能解决你的问题,请参考以下文章

MFC 对话框的属性页包含文件在 Visual Studio 2008 中显示为空

处理丢失 MSVCP140D.dll 的 Visual Studio 设置

Visual Studio设置来处理丢失的MSVCP140D.dll

CMake构建Visual Studio中MFC项目的MFC配置问题

将较新的 Visual Studio 版本与较旧的 MFC 版本一起使用?

MFC 是不是仅适用于 Visual Studio,不适用于 Visual C++ Express?