為了獲得更大顯示區域或特殊 UI 需求,有時需要動態隱藏或顯示視窗標題列。本文說明在 MFC 架構下的實作方法,亦適用於一般 Windows API 開發。
CWnd::ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0) 可動態增減視窗樣式。WS_CAPTION 控制標題列顯示。
ID_VIEW_TITLE_BARCMainFrame 成員:BOOL m_bViewTitleBar,建構子初始化為 TRUE
void CMainFrame::OnViewTitleBar() {
m_bViewTitleBar = !m_bViewTitleBar;
if (!m_bViewTitleBar) { // 隱藏
ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED);
} else { // 顯示
ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED);
}
}
void CMainFrame::OnUpdateViewTitleBar(CCmdUI* pCmdUI) {
pCmdUI->SetCheck(m_bViewTitleBar);
}
void CMainFrame::OnViewTitleBar() {
m_bViewTitleBar = !m_bViewTitleBar;
LONG lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
if (!m_bViewTitleBar) { // 隱藏
::SetWindowLong(m_hWnd, GWL_STYLE, lStyle & ~WS_CAPTION);
} else { // 顯示
::SetWindowLong(m_hWnd, GWL_STYLE, lStyle | WS_CAPTION);
}
// 重繪視窗框架
::SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
}
SWP_FRAMECHANGED 強制 WM_NCCALCSIZE 重算非客戶區,使標題列變更即時生效。ModifyStyle 內部實際呼叫上述三個 API:GetWindowLong、SetWindowLong、SetWindowPos。全螢幕模式、簡報模式、自訂標題列、最大化顯示區域等需動態切換標題列的場合。