【问题标题】:How to use CMenu in an MFC application?如何在 MFC 应用程序中使用 CMenu?
【发布时间】:2011-01-21 16:50:10
【问题描述】:

我制作了一个 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:'initializing':无法从'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 );
}

【问题讨论】:

    标签: c windows mfc


    【解决方案1】:
    1. 有一种简单的方法可以禁用系统中的“关闭”菜单。请将CS_NOCLOSE 的位添加到类样式中。您可以使用SetClassLong 更改班级风格。

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

    请注意,MFC 对象(例如 CMenu、CWnd)和 Win32 句柄(例如 HMENU、HWND)之间的映射是 somewhat complex。我之所以说它复杂,是因为有两种类型的映射:临时的和永久的。如果你通过调用CMenu::FromHandle来制作CMenu,它是一个临时映射;下次调用空闲处理程序 (OnIdle) 时,映射将断开连接(即,CMenu 对象将被删除)。相反,如果你创建了一个CWnd对象并创建了一个实际的Window(注意MFC不会通过仅仅创建CWnd来自动创建一个真正的Window对象),那么CWnd和@之间存在一个永久的映射关系。 987654336@.

    【讨论】:

    • 请注意,CS_NOCLOSE 将在此过程中影响该类的 ALL 窗口。这通常不是您的应用程序窗口的问题,但可能是弹出窗口的问题。
    • 嗨!我更新了我的帖子。这几乎可以正常工作,但是在重新启用后按下按钮,它不会退出:(你知道为什么吗?
    • 对不起,没用,因为我忘了注释掉一些代码。我的错。感谢您的帮助!
    【解决方案2】:

    GetSystemMenu 是返回 HMENU 的 Win32 api 的名称,GetSystemMenu 也是 CWnd 类上的 MFC 方法的名称,所以当你在 CWnd 的方法中时类,您将使用返回 CMenu 的 MFC GetSystemMenu 方法,但当您不使用时,您将使用返回 HMENU 的 Win32 API。

    您可以使用::GetSystemMenu 来始终使用 Win32 API。或者您可以向您的类添加一个从 CWnd 派生的公共方法,可以调用它来进行菜单修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多