早期隱藏工作列圖示常建立隱藏的 CFrameWnd 做父視窗,但需註冊視窗類別、處理圖示等較繁瑣。本文提供更簡潔做法:直接建立一個隱藏的 CDialog 做父視窗,再移除子對話框的 WS_EX_APPWINDOW 延伸風格,幾行程式碼即可完成。
WS_EX_APPWINDOW:強制將可見的最上層視窗放入工作列。移除此風格即可隱藏圖示。CDialog 做父視窗比 CFrameWnd 更輕量,且 Alt+Tab 切換圖示正常 (用 CWnd 會導致圖示異常)。
BOOL CHideApp::InitInstance() {
// 1. 建立隱藏父對話框
CHideDlg dlgParent;
dlgParent.Create(IDD_HIDE_DIALOG); // 資源編輯器建立空對話框
dlgParent.ShowWindow(SW_HIDE); // 完全隱藏
// 2. 建立真正主對話框,指定父視窗
CHideDlg dlg(&dlgParent);
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
// 3. 清理
dlgParent.DestroyWindow();
return FALSE; // 模態對話框結束即離開應用程式
}
BOOL CHideDlg::OnInitDialog() {
CDialog::OnInitDialog();
// 關鍵:移除 WS_EX_APPWINDOW
ModifyStyleEx(WS_EX_APPWINDOW, 0);
return TRUE;
}
class CHideDlg : public CDialog {
public:
CHideDlg(CWnd* pParent = NULL); // 標準建構子
enum { IDD = IDD_MAIN_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
};
| 方法 | 優點 | 缺點 |
|---|---|---|
| 隱藏 CFrameWnd | 標準做法 | 需註冊視窗類、處理圖示、程式碼較多 |
| 隱藏 CWnd | 最輕量 | Alt+Tab 圖示異常、需自行註冊類別 |
| 隱藏 CDialog (本文) | 程式碼極少、Alt+Tab 正常、無需註冊類別 | 佔用一個對話框資源 (極小) |
利用 CDialog 做隱藏父視窗 + ModifyStyleEx(WS_EX_APPWINDOW, 0),是目前最簡潔、相容性最好 (Win9x/NT/2000/XP/Win7+) 的隱藏工作列圖示方案,強烈建議取代舊有 CFrameWnd 做法。