Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Windows';不丢失功能的系统菜单_C++_Windows_Mfc_Systemmenu - Fatal编程技术网

C++ 从Windows';不丢失功能的系统菜单

C++ 从Windows';不丢失功能的系统菜单,c++,windows,mfc,systemmenu,C++,Windows,Mfc,Systemmenu,我想从基于Windows对话框的应用程序的系统菜单中删除“移动”和“关闭”命令,而不会丢失这些命令的功能或删除系统菜单。(我使用MFC,但开放到纯C++解决方案) 以下操作将从系统菜单中删除移动命令: CMenu* pSysMenu = GetSystemMenu(FALSE); if(pSysMenu != NULL) pSysMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND); 但窗口不能再被拖动 类似地,这将删除Close命令 pSysM

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

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

CMenu* pSysMenu = GetSystemMenu(FALSE);
if(pSysMenu != NULL)
        pSysMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);
但窗口不能再被拖动

类似地,这将删除Close命令

pSysMenu->RemoveMenu(SC_CLOSE, MF_BYCOMMAND);
但它也会禁用窗口标题栏中的关闭按钮(“x”)

谢谢


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

您可以从
WM\u 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()
然后,您将在
onitmenupopup
中删除这些项目(就像您所做的那样):

pPopupMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);
pPopupMenu->InsertMenuItemW(SC_MOVE, &m_mii);
并将其重新插入到操作菜单中:

pPopupMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);
pPopupMenu->InsertMenuItemW(SC_MOVE, &m_mii);
请注意我在类中定义的
&m_mii

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


另外,你要知道,你永远不会在系统菜单中显示这些项目,所以你不必费心保存它们的位置、位图甚至字符串。只需将它们附加到底部,仅限命令ID。

创建自己的绘制窗口,手动绘制此类按钮,并手动执行请求的功能。请参阅。通过返回适当的值(取决于单击的位置),您可能能够获得所需的行为。返回
HTCAPTION
拖动窗口。@Steve-请参阅下面我的备注以获得答案;会让事情变得更简单谢谢,@Vlad Feinstein!在您出色的解决方案之后,我删除了标题栏,当鼠标位于应用程序上方时显示我自己的“系统菜单”图标,并允许从客户端区域拖动窗口。在这个特定的应用程序中,最终感觉更像微软。我提到这是一个选项,以防其他人最终出现在这个线程中,但您记录了OnInitMenuOpup()方法。再次感谢!