我想在不失去这些命令的功能或删除系统菜单的情况下,从基于Windows对话框的应用程序的系统菜单中删除"移动"one_answers"关闭"命令。(我使用MFC,但对纯c++解决方案开放。(
以下操作将从系统菜单中删除"移动"命令:
CMenu* pSysMenu = GetSystemMenu(FALSE);
if(pSysMenu != NULL)
pSysMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);
但是窗口不能再拖动了。
类似地,这将删除"关闭"命令。
pSysMenu->RemoveMenu(SC_CLOSE, MF_BYCOMMAND);
但它也禁用了窗口标题栏中的关闭按钮("x"(。
谢谢!
(我知道你们中的一些人很想告诉我,我不应该删除这些命令。我听到了,但这是一个独特的情况。谢谢。(
您可以从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
填充它。很可能,您只需要做一次并保存以备以后使用。这将允许您保存菜单字符串、位图等。但是,没有直接的方法(据我所知(来获得您的项目在原始菜单中的位置;我会按位置遍历所有项目,查找这些命令。有点乏味。。。
第页。S.只要意识到你永远不会在系统菜单中显示这些项目,所以你不需要麻烦保存它们的位置、位图甚至字符串。只需将它们附加到底部,仅限命令ID。