許多應用程式使用系統托盤圖示,此時工作列按鈕顯得多餘。對於已採用文檔/視圖架構的成熟專案,大幅重構不現實。本文提供簡單技巧:建立隱藏父視窗,使框架視窗不出現在工作列。
工作列只顯示無擁有者(Owner)的最上層視窗。若框架視窗擁有隱藏的父視窗,系統視其為子視窗,不在工作列顯示。
class CMainFrame : public CFrameWnd {
protected:
CWnd m_wndParent; // 隱藏父視窗
// ...
};
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
if (!CFrameWnd::PreCreateWindow(cs)) return FALSE;
// 建立隱藏 POPUP 視窗作為父視窗
if (!::IsWindow(m_wndParent.m_hWnd)) {
LPCTSTR pstrOwnerClass = AfxRegisterWndClass(0);
if (!m_wndParent.CreateEx(0, pstrOwnerClass, _T(""),
WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, 0))
return FALSE;
}
cs.hwndParent = m_wndParent.m_hWnd; // 設定框架視窗父視窗
return TRUE;
}
WS_POPUP:建立無標題列、無邊框的彈出式視窗CW_USEDEFAULT:位置尺寸由系統決定(隱藏視窗不重要)cs.hwndParent:關鍵步驟,將框架視窗的建立父視窗設為隱藏視窗AfxRegisterWndClass(0):註冊簡單視窗類別,無額外樣式Shell_NotifyIcon)使用效果最佳WS_EX_TOOLWINDOW 擴充樣式| 方法 | 優點 | 缺點 |
|---|---|---|
| 隱藏父視窗(本文) | 改動最小,相容現有架構 | Alt+Tab 仍可見 |
| 建立對話方塊應用 | 原生無工作列按鈕 | 需重構文檔/視圖架構 |
| WS_EX_TOOLWINDOW | 完全隱藏任務切換器 | 視窗外觀改變(無系統選單) |