2

我想从基于 Windows 对话框的应用程序的系统菜单中删除移动和关闭命令,而不会丢失这些命令的功能或删除系统菜单。(我正在使用 MFC,但对纯 C++ 解决方案持开放态度。)

以下将从系统菜单中删除移动命令:

CMenu* pSysMenu = GetSystemMenu(FALSE);
if(pSysMenu != NULL)
        pSysMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);

但是窗口不能再被拖动。

同样,这将删除关闭命令。

pSysMenu->RemoveMenu(SC_CLOSE, MF_BYCOMMAND);

但它也会禁用窗口标题栏中的关闭按钮(“x”)。

谢谢!

(我知道你们中的一些人很想告诉我我不应该删除这些命令。我听到了,但这是一个独特的情况。谢谢。)

4

1 回答 1

3

您可以从处理程序的系统菜单中删除这些项目WM_INITMENUPOPUP

正如您所注意到的,这将禁用窗口中的相关功能。

但是,您可以在鲜为人知的WM_UNINITMENUPOPUP消息的处理程序中恢复这些项目。

将此添加到对话框的类定义中:

afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
afx_msg void OnUnInitMenuPopup(CMenu *pPopupMenu, UINT nFlags);

将此添加到其消息映射中:

ON_WM_INITMENUPOPUP()
ON_WM_UNINITMENUPOPUP()

然后,您将删除这些项目(就像您所做的那样)OnInitMenuPopup

pPopupMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);

并将它们重新插入OnUnInitMenuPopup

pPopupMenu->InsertMenuItemW(SC_MOVE, &m_mii);

请注意&m_mii,我在课堂上定义了:

MENUITEMINFO m_mii = {sizeof MENUITEMINFO};

您将为需要隐藏的每个菜单项声明该结构,并GetMenuItemInfo在删除它们之前填充它。很可能,您只需执行一次并保存以备后用。这将允许您保存菜单字符串、位图等。但是,没有直接的方法(据我所知)来获取您的项目在原始菜单中的位置;我会按位置遍历所有项目以查找这些命令。有点乏味...

PS 请意识到您永远不会在系统菜单中显示这些项目,因此您无需费心保存它们的位置、位图甚至字符串。只需将它们附加到底部,仅命令 ID。

于 2020-10-10T21:23:34.350 回答