2010-02-27 46 views
2

我做了一个MFC应用程序,现在我想在我做复制操作时关闭窗口的关闭按钮。我做了这个代码全成:如何在MFC应用程序中使用CMenu?

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

更新: 我试过这种方法,几乎​​工作。关闭“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); 
} 

回答

2
  1. 没有在系统中禁用“关闭”菜单的简单方法。请将CS_NOCLOSE的位添加到课堂风格中。您可以使用SetClassLong更改课程风格。

  2. 为什么不使用Win32 API而不使用MFC函数?例如,只需使用返回HMENU::GetSystemMenu即可。通常,您可以从HMENU,CMenu::FromHandle创建CMenu,但在这种简单情况下,直接使用Win32 API会更好。

请注意,MFC对象之间的映射(例如,CMenu的,CWnd的)和Win32把手(例如,HMENU,HWND)是somewhat complex。我之所以说它很复杂,是因为有两种类型的映射:时间和永久。如果您致电CMenu,请致电CMenu::FromHandle,这是一个临时映射;当下次调用空闲处理程序(OnIdle)时,映射将断开连接(即CMenu对象将被删除)。相反,如果您创建一个CWnd对象并创建一个实际的窗口(请注意,MFC不会通过创建CWnd自动创建一个真实的窗口对象),则在CWndHWND之间存在永久映射。

+0

请注意CS_NOCLOSE会影响该过程中该类的_ALL_窗口。这通常不是您的应用程序窗口的问题,但可能是弹出窗口的问题。 – 2010-02-27 01:59:22

+0

谢谢!那就对了。 – minjang 2010-02-27 02:04:48

+0

嗨!我更新了我的帖子。这工作几乎没有问题,但重新启用后按下按钮,它不会退出:(你知道为什么吗? – kampi 2010-02-27 02:42:11

0

GetSystemMenu是一个Win32 API返回HMENU的名字,GetSystemMenu上CWnd类的MFC方法的名称,所以当你在CWnd类的方法,您将使用MFC GetSystemMenu返回CMenu的方法,但是当你不使用Win32 API时,它将返回HMENU。您可以使用::GetSystemMenu来始终使用Win32 API。或者你可以添加一个公开的方法到你的类,从CWnd派生出来可以调用它来做菜单修正。

相关问题