如何在MFC应用程序中使用CMenu?
我制作了一个MFC应用程序,现在我想在执行复制操作时关闭窗口的关闭按钮。我成功地使用以下代码:如何在MFC应用程序中使用CMenu?,c,windows,mfc,C,Windows,Mfc,我制作了一个MFC应用程序,现在我想在执行复制操作时关闭窗口的关闭按钮。我成功地使用以下代码: BOOL bEnable = FALSE; // To disable UINT menuf = bEnable ? (MF_BYCOMMAND) : (MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); CMenu* pSM = GetSystemMenu( , FALSE ); if ( pSM ) { pSM->EnableMenuItem(
BOOL bEnable = FALSE; // To disable
UINT menuf = bEnable ? (MF_BYCOMMAND) : (MF_BYCOMMAND | MF_GRAYED | MF_DISABLED);
CMenu* pSM = GetSystemMenu( , FALSE );
if ( pSM )
{
pSM->EnableMenuItem( SC_CLOSE, menuf );
}
但是现在,在我的线程(UINT CopyThread(LPVOID pParam))中的程序结束时,我想重新启用它,但我不能。我之前将m_hWnd传递给了我的线程,现在我不想将其传递给GetSystemMenu函数,但我得到了一个编译器错误:错误C2440:“初始化”:无法从“HMENU”转换为“CMenu*”。我相信这是一个简单的问题,但我是一个初学者,所以请帮助,但我不明白,我在做什么
提前谢谢
坎皮
更新:
我试过这种方法,几乎奏效。关闭的“X”将再次变为黑色,但如果我按下它,我的程序将不存在。我做错了什么,还是因为别的什么
BOOL bEnable = TRUE; // To enable
UINT menuf = bEnable ? (MF_BYCOMMAND) : (MF_BYCOMMAND | MF_GRAYED | MF_DISABLED);
HMENU pSM = ::GetSystemMenu( Test->hWnd, FALSE );
if ( pSM )
{
::EnableMenuItem(pSM, SC_CLOSE, menuf );
}
CS\u NOCLOSE
位。您可以使用SetClassLong
更改类样式::GetSystemMenu
返回humenu
。一般来说,您可以通过CMenu::FromHandle
从humenu
创建CMenu
,但在这种简单的情况下,直接使用Win32 API要好得多CMenu::FromHandle
来创建CMenu
,则这是一个临时映射;下次调用空闲处理程序(OnIdle
)时,映射将断开连接(即,CMenu
对象将被删除)。相反,如果您创建一个CWnd
对象并创建一个实际的窗口(请注意,MFC不会仅仅通过创建CWnd
自动创建一个真正的窗口对象),那么CWnd
和HWND
之间存在一个永久映射,也是CWnd类上MFC方法的名称,因此当您在CWnd类的方法中时,您将使用返回CMenu的MFC GetSystemMenu方法,但当您不在时,您将使用返回CMenu的Win32 API
您可以使用
::GetSystemMenu
始终使用Win32 API。或者,您可以将一个公共方法添加到从CWnd派生的类中,并可以调用它来执行菜单修复。请注意,在这个过程中,CS\U NOCLOSE将影响该类的所有窗口。这通常不是应用程序窗口的问题,但可能是弹出窗口的问题。您好!我更新了我的帖子。这几乎可以正常工作,但是在重新启用后按下按钮,它不会退出:(你知道为什么吗?对不起,它没有工作,因为我忘记注释一些代码。我的错误。谢谢你的帮助!