有時候為了實際的顯示面積大一些或其他的一些原因需要對標題條進行隱藏或顯示。本文使用一個簡單的例子,說明如何在MFC應用程序的框架下來實現它。其中使用API的方法也可用於其他的Windows應用開發環境。
CWnd類提供了一個函數ModifyStyle(),用於改變窗口的風格,原型如下:
BOOL ModifyStyle( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );
其中參數dwRemove為希望去掉的窗口風格,參數dwAdd為希望加上的窗口風格,參數nFlags用於確定窗口的大小與位置。
以下以一個MFC MDI應用為例說明:(功能和代碼為啥不分開,感覺上不能1、2、3排起來)
1.添加一個菜單項,ID為ID_VIEW_TITLE_BAR,並用類向導為CMainFrame生成消息函數OnViewTitleBar和OnUpdateViewTitleBar。
2.為CMainFrame添加一個BOOL型的成員變量m_bViewTitleBar,並在構造函數中賦為TRUE
3.為OnViewTitleBar添加如下實現
void CMainFrame::OnViewTitleBar()
{
m_bViewTitleBar = !m_bViewTitleBar;
if (m_bViewTitleBar == FALSE) { // 隱藏TitleBar
ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED);
}
else { // 顯示TitleBar
ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED);
}
}
4.為OnUpdateViewTitleBar添加如下實現
void CMainFrame::OnUpdateViewTitleBar(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bViewTitleBar);
}
ModifyStyle在內部實際調用了三個API函數,在OnViewTitleBar也可以使用API來直接實現。
void CMainFrame::OnViewTitleBar()
{
m_bViewTitleBar = !m_bViewTitleBar;
LONG lStyle = ::GetWindowLong(this->m_hWnd, GWL_STYLE);
if (m_bViewTitleBar == FALSE) { // 隱藏TitleBar
::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle & ~WS_CAPTION);
::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE |
SWP_FRAMECHANGED);
}
else { // 顯示TitleBar
::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle | WS_CAPTION);
::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE |
SWP_FRAMECHANGED);
}
本文源程序在Win2000 SP3 + VC6.0中調試通過。
本文配套源碼