關於MFC程式中隱藏工作列圖示的問題
阿新 • • 發佈:2019-01-01
前幾天有個MFC對話方塊程式,有個隱藏工作列圖示的功能需求,就在網上搜了搜,發現基本上都是這一句: ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);也就是修改視窗的擴充套件風格,去掉APPWINDOW屬性,新增TOOLWINDOW屬性,這樣做的效果就是工作列的圖示按鈕不見了,同時視窗的標題欄也發生了變化,原來的最小化最大化按鈕都不見了 (對於這一點很不爽,可能設計者有自己的原因),而且基本上都是將這句放在對話方塊的OnInitDialog中使用,無法在其他地方來隨時改變(其實是可以的,只不過需要使用前後分別先隱藏和顯示視窗而已也就是先ShowWindow(SW_HIDE),然後修改樣式,再接著ShowWindow(SW_SHOW),如果單純修改樣式是沒有效果的,這個細節折騰了我很久)。
再說說上邊不爽的地方,鑑於TOOLWINDOW樣式會修改原視窗標題樣式,那有沒有其他方法不改變原視窗標題欄樣式呢,當然有了。
以MFC對話方塊程式為例,原理就是建立一個隱藏的視窗,然後設為主對話方塊的父視窗就行了,以下是程式碼示例:
BOOL CTestDlgApp::InitInstance()
{
......
// 建立一個隱藏的視窗,以便控制主對話方塊在工作列的隱藏和顯示
CWnd m_wndOwner;
if (m_wndOwner.m_hWnd == NULL)
{
LPCTSTR pstrOwnerClass = AfxRegisterWndClass(0);
if (!m_wndOwner.CreateEx(0, pstrOwnerClass, _T(""), //建立一個隱藏的彈出樣式的視窗
WS_POPUP, CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, 0 ))
return FALSE;
}
////////////////////////////////////////////////
......
CTestDlg dlg(&m_wndOwner); // 以隱藏的視窗作為父視窗
m_pMainWnd = &dlg;
......
// 銷燬隱藏的父視窗
if (m_wndOwner.m_hWnd != NULL)
m_wndOwner.DestroyWindow();
return FALSE;
}
通過上邊的操作,在對話方塊中需要顯示和隱藏的地方,使用如下程式碼即可方便自如的隨時控制工作列圖示的顯示和隱藏。
顯示:
ShowWindow(SW_HIDE);
ModifyStyleEx(0, WS_EX_APPWINDOW); // 恢復工作列顯示.
ShowWindow(SW_SHOW);
隱藏:
ShowWindow(SW_HIDE);
ModifyStyleEx(WS_EX_APPWINDOW, 0);//從工作列中去掉.
ShowWindow(SW_SHOW);
這樣處理後的對話方塊的標題欄沒有任何改變,完美實現隨時隱藏和顯示工作列圖示。
值得一提的是這樣隱藏工作列圖示後,在使用ALT+TAB切換程式時,看不到應用程式。這個問題沒有繼續研究,知道的朋友可以留言交流。