MFC中基於對話方塊的程式啟動後自動隱藏
有的程式需要在啟動後立即隱藏主視窗,只在系統托盤區域顯示一個圖示,這常見於很多後臺服務程式。對於基於對話方塊的程式,要實現此功能需要一點技巧。
該技術的關鍵點在於,需要使用非模態對話方塊,而不是預設的模態對話方塊。模態對話方塊的DoModal()事實上執行了對話方塊的建立、顯示、訊息迴圈等一系列過程。我們這裡要做的就是把這個過程重現,並控制中間的顯示過程來達到我們隱藏主視窗的目的。現實起來非常簡單,我們只需要把CXXXApp中的InitInstance()函式中預設的對話方塊顯示程式碼:
BOOL CXXXApp::InitInstance()
{
// 其它程式碼
// 主視窗對話方塊例項
CXXXDlg dlg;
m_pMainWnd = &dlg;
// 模態對話方塊
dlg.DoModal();
return FALSE;
}
改變為如下程式碼即可,其它地方的程式碼完全不用修改:
BOOL CXXXApp::InitInstance()
{
// 其它程式碼
// 主視窗對話方塊例項
CXXXDlg dlg;
m_pMainWnd = &dlg;
// 非模態對話方塊
dlg.Create(CXXXDlg::IDD);
dlg.DoSomethingBeforeMsgLoop (); // 可以在此函式隱藏視窗及執行其它操作
dlg.RunModalLoop();
return FALSE;
}
在上面的程式碼中,可以在DoSomethingBeforeMsgLoop()函式中使用ShowWindow()來隱藏視窗,同時還可以執行其它一些操作,也可以直接在DoSomethingBeforeMsgLoop()函式呼叫處呼叫ShowWindow()函式來隱藏視窗。
也有人提出了其它方法。比如仍然使用模態對話方塊,但使用計數器設定很短一個時間來觸發事件,並在處理該計數器事件中隱藏視窗。該方法可行,但太麻煩,沒有上面的方法方便。