2011-09-26 213 views
15

使用Windows MFC C++。我有一個第三方應用程序,它在我的CWinApp派生類中調用用戶定義的方法。這個方法在InitInstance()之後被調用。如果在這個方法中有一個錯誤,例如拋出一個異常並被try/catch塊捕獲,我想從catch塊中退出應用程序。什麼是規範和正確的戒菸方式?以編程方式退出MFC應用程序的正確方法是什麼?

UPDATE:

嗶嘰我認爲是正確的,在InitInstance中()返回false是退出應用程序的正確方法。但是,現在假設我想退出CDialog派生類的OnInitDialog()處理程序,那麼正確的方法是什麼。

更新2

對於我來說,我發現調用PostMessage的(WM_CLOSE)是從我的非模態CDialog派生類的最佳途徑。在某些情況下,我嘗試過的所有其他戒菸方法都會引發一些異常或其他情況。

這裏是我如何使用它的一個例子:

BOOL SomeDialog::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    ::OleInitialize(nullptr); 

    try 
    { 
     // ...load settings file here 
    } 
    catch(...) 
    { 
     PostMessage(WM_CLOSE); 
     return TRUE; 
    } 

    // return TRUE unless you set the focus to a control 
    return TRUE; 
} 
+0

啊!這是一個基於對話框的應用程序。看到我編輯的答案。 –

回答

23

在InitInstance中()

退出應用程序,而你仍然在InitInstance():只需從InitInstance()返回FALSE

在主消息循環

又是另一回事但如果你已經在消息循環:標準的方式來關閉一個應用程序是退出消息循環:

PostQuitMessage(0),其名稱暗示,發佈WM_QUIT消息。消息循環通過退出循環並關閉程序來作出反應。

但是你不應該簡單地這樣做:你應該關閉你的應用程序打開的窗口。 假設你只有你的主窗口中,你應該通過調用

m_pMainWindow->DestroyWindow(); 

MFC將PostQuitMessage()爲你的反應摧毀它,因此退出主消息循環,並關閉應用。

更好的是,你應該發佈一個WM_CLOSE讓你的主窗口優雅地關閉。例如,它可能決定保存當前文檔。但要小心:標準OnClose()處理程序可能會提示用戶保存髒文檔。用戶甚至可以使用此提示取消關閉操作(保存文檔?是,否,取消)。

銷燬主窗口會發送一條WM_DESTROY消息給它。 MFC通過調用PostQuitMessage(0)作出反應以退出消息泵。(實際上,MFC不會因爲WM_NCDESTROYOnNcDestroy()通話是通過窗口收到的最後一個絕對mesage)

基於對話框的應用

呼叫EndDialog(-1); //或取代-1由IDCANCEL,無論

您可能知道,此調用將關閉對話框。

請注意,基於對話框的應用程序的主對話框在InitInstance()中執行。關閉對話框將簡單地退出InitInstance(),該項目始終返回FALSE

+0

zadane剛剛以答案的形式向您發表評論。我真的認爲,StackOverflow的政策阻止你發表評論,直到你獲得50名代表爲止。 –

+0

@Mark,謝謝你讓我知道。 –

+0

有關WM_DESTROY的有趣故事:http://blogs.msdn.com/b/oldnewthing/archive/2011/09/26/10216420.aspx –

7

只需使用:

PostQuitMessage(0); 

記住你的程序將不會從這個函數立即退出,窗口/程序將獲得一個WM_QUIT消息,然後你的程序將退出。

+1

這是另一種方式:WM_CLOSE,破壞窗口。在對主窗口進行刪除後,MFC將接着PostQuitMessage(0),因爲它的名字意味着發佈WM_QUIT,這會導致退出消息循環。 –

1

塞爾 - 你的答案不幸的是不是最好的辦法。 PostQuitMessage(0)是要走的路,MFC會爲你破壞窗口。你應該避免直接調用m_pMainWindow-> DestroyWindow()。

+0

閱讀[關於PostQuitMessage()]的文檔(http://msdn.microsoft.com/zh-cn/library/default.aspx)。 COM/EN-US /庫/窗/桌面/ ms644945(v = vs.85)的.aspx)。 –

+1

該文檔沒有說我不正確的地方。 DestroyWindow()是虛函數,當你通過發佈消息告訴它關閉窗口時,MFC會爲你調用它。最好將它留給MFC來爲你做,而不是直接調用它,因爲通常在銷燬窗口和MFC處理它時會發生一系列事件。在某些情況下,如果我們知道我們在做什麼,我們可以直接調用它。 – zar

+0

你從哪裏看到調用PostQuitMessage()會關閉或銷燬你的窗口? –

相關問題