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

我做了一个MFC应用程序,现在我想closures窗口的closuresbutton,在我做我的复制操作。 我用这段代码取得了成功:

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 *'。 我敢肯定,这是一个简单的问题,但我是一个初学者,所以请帮助,但我不明白,我在做什么工作!

提前致谢!

kampi

更新:我试过这种方式,几乎可以工作。 closures“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 ); } 

  1. 有一个简单的方法来禁用系统中的“关闭”菜单。 请将CS_NOCLOSE的位添加到类样式中。 您可以通过使用SetClassLong更改类样式。

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

请注意MFC对象(例如,CMenu,CWnd)和Win32句柄(例如HMENU,HWND)之间的映射有点复杂 。 我之所以说这是复杂的,有两种类型的映射:时间和永久。 如果您通过调用CMenu::FromHandle创建CMenu ,那么这是一个临时映射; 当下一次调用空闲处理程序( OnIdle )时,映射将被断开(即,将删除CMenu对象)。 相反,如果您创建一个CWnd对象并创建一个实际的窗口(请注意MFC不会通过创建CWnd自动创建一个真实的Window对象),那么CWndHWND之间就会有一个永久映射。

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

您可以使用::GetSystemMenu始终使用Win32 API。 或者你可以添加一个公共方法到你的类从CWnd派生的可以调用它来做菜单修正。