Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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/0/windows/15.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
如何在MFC应用程序中使用CMenu?_C_Windows_Mfc - Fatal编程技术网

如何在MFC应用程序中使用CMenu?

如何在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(

我制作了一个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( 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
    更改类样式

  • 为什么不使用Win32 API,而不是MFC函数?例如,只需使用
    ::GetSystemMenu
    返回
    humenu
    。一般来说,您可以通过
    CMenu::FromHandle
    humenu
    创建
    CMenu
    ,但在这种简单的情况下,直接使用Win32 API要好得多

  • 请注意,MFC对象(如CMenu、CWnd)与Win32句柄(如HMENU、HWND)之间的映射是不正确的。我之所以说它很复杂,是因为有两种类型的映射:时间映射和永久映射。如果通过调用
    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将影响该类的所有窗口。这通常不是应用程序窗口的问题,但可能是弹出窗口的问题。您好!我更新了我的帖子。这几乎可以正常工作,但是在重新启用后按下按钮,它不会退出:(你知道为什么吗?对不起,它没有工作,因为我忘记注释一些代码。我的错误。谢谢你的帮助!