開發對話方塊型應用程式時,預設會在工作列顯示圖示。有讀者嘗試依 MSDN 文件設定 WS_EX_TOOLWINDOW 延伸視窗樣式卻失效。經深入研究,發現單靠此樣式無法對對話方塊生效,必須結合三個條件:
WS_EX_TOOLWINDOW;WS_EX_APPWINDOW 延伸樣式。範例程式結構簡單,標頭與實作合於單一檔案。關鍵程式碼解析:
class CMainFrame : public CFrameWnd {
protected:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
};
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
if (CFrameWnd::PreCreateWindow(cs)) {
cs.dwExStyle |= WS_EX_TOOLWINDOW; // 關鍵:設定工具視窗樣式
return TRUE;
}
return FALSE;
}
在 PreCreateWindow 中設定延伸樣式,使框架視窗不出現在工作列。因框架視窗不可見,標題列大小無關緊要。
BOOL CMyApp::InitInstance() {
CMainFrame* pFrame = new CMainFrame;
m_pMainWnd = pFrame;
pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPED, NULL, NULL);
CMyDlg dlg(pFrame); // 以不可見框架為父視窗
int nResponse = dlg.DoModal();
return FALSE; // 對話方塊結束即退出
}
即使框架不可見,資源檔仍需給它一個選單,否則 MFC 會報錯。
預設 VC++ 專案資源檔(.rc)中對話方塊常含 EXSTYLE WS_EX_APPWINDOW,此樣式會強制顯示於工作列,必須手動移除:
// 在對話方塊 OnInitDialog 中測試效果
// ModifyStyleEx(0, WS_EX_APPWINDOW); // 加上這行將導致隱藏失效
直接編輯 .rc 檔刪除該行,或確保程式碼中未設定此樣式。
理論上,建立隱藏父視窗(WS_EX_TOOLWINDOW)是為了讓對話方塊保有標準標題列;若接受較小的工具視窗標題,甚至可不設 WS_EX_TOOLWINDOW,但 WS_EX_APPWINDOW 一定要關閉。實測僅關閉 WS_EX_APPWINDOW 即可隱藏,說明 WS_EX_TOOLWINDOW 非決定性因素。歡迎有更多經驗的開發者交流補充。
範例包含 CMainFrame(不可見框架)、CMyDlg(主對話方塊)、CAboutDlg(關於對話方塊)、CMyApp(應用程式類別),完整展示 MFC 訊息對應、圖示設定、系統命令處理等細節。