1. 程式人生 > >關於MFC程式中隱藏工作列圖示的問題

關於MFC程式中隱藏工作列圖示的問題

前幾天有個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切換程式時,看不到應用程式。這個問題沒有繼續研究,知道的朋友可以留言交流。