C++ 仅在MFC菜单栏上禁用自定义

C++ 仅在MFC菜单栏上禁用自定义,c++,mfc,customization,mfc-feature-pack,cmfctoolbar,C++,Mfc,Customization,Mfc Feature Pack,Cmfctoolbar,在VS2010中使用MFC功能包时,是否可以在CMFCMenuBar上禁用自定义功能,但在工具栏上保持启用状态?我们不希望用户拖动菜单,但他们可以自由更改工具栏 我们禁用了在退出时将CMFCMenuBar的状态保存到注册表中,但在运行时仍然可以移动或删除菜单 更新: 按照xMRi的回答,我在派生菜单类的构造函数中将m_bDisableCustomize设置为TRUE。我注意到有一个重绘问题,在定制过程中单击菜单会在菜单上画满黑匣子。这让我想到 我不想修改MFC源代码,因此改为处理消息: //{{

在VS2010中使用MFC功能包时,是否可以在CMFCMenuBar上禁用自定义功能,但在工具栏上保持启用状态?我们不希望用户拖动菜单,但他们可以自由更改工具栏

我们禁用了在退出时将CMFCMenuBar的状态保存到注册表中,但在运行时仍然可以移动或删除菜单

更新: 按照xMRi的回答,我在派生菜单类的构造函数中将m_bDisableCustomize设置为TRUE。我注意到有一个重绘问题,在定制过程中单击菜单会在菜单上画满黑匣子。这让我想到

我不想修改MFC源代码,因此改为处理消息:

//{{AFX_MSG_MAP(CMyMFCMenuBar)
BEGIN_MESSAGE_MAP(CMyMFCMenuBar, CMFCMenuBar)
    ON_WM_LBUTTONDOWN()
    ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
//}}AFX_MSG_MAP

void CMyMFCMenuBar::OnLButtonDown(UINT nFlags, CPoint point)
{
    CMFCMenuBar::OnLButtonDown(nFlags, point);
    Invalidate();
}

void CMyMFCMenuBar::OnContextMenu(CWnd* pWnd, CPoint pos)
{
    if (IsCustomizeMode())
        return;
    CMFCMenuBar::OnContextMenu(pWnd, pos);
}

这似乎解决了重画的问题。请告诉我是否有更好的方法解决重绘问题。

将成员变量m_bDisableCustomize设置为TRUE。

我将使用

EnableCustomizeButton(FALSE, NULL);

创建窗口后。

将m_bDisableCustomize设置为TRUE有效,但如果在自定义过程中单击菜单,则会出现重绘问题。如果用户右键单击菜单栏,即使设置了变量,他们仍可以修改(重命名、删除)顶层按钮。有没有办法在自定义模式下禁用右键单击上下文菜单?有一条消息名为AFX_WM_Toolbar menu。尝试在父帧中处理它。Afaik这是提供有问题菜单的上下文菜单。Ort检查OnContextMenu的路径…我以前尝试过AFX_WM_TOOLBARMENU,在自定义对话框打开之前,它仅用于上下文菜单。但是在菜单栏类中处理WM_CONTEXTMENU和OnContextMenu非常有效!谢谢