如何解决从Windows的系统菜单中删除移动和关闭命令,而不会丢失功能
我想从基于Windows对话框的应用程序中的系统菜单中删除“移动”和“关闭”命令,而又不丢失这些命令的功能或删除系统菜单。 (我使用的是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
填充它。您可能只需要执行一次,然后保存以备后用。这将允许您保存菜单字符串,位图等。但是,据我所知,没有直接方法可以获取项目在原始菜单中的位置。我会逐位遍历所有项目以查找那些命令。有点乏味...
P.S。只是意识到您永远不会在系统菜单中显示这些项目,因此您无需费心保存它们的位置,位图甚至字符串。只需将它们附加到底部(仅命令ID)即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。