2010-02-27 45 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派生出來可以調用它來做菜單修正。

相關問題