您可以从处理程序的系统菜单中删除这些项目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。