首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

徹底隱藏對話方塊程式在工作列的圖示:三步驟關鍵技巧

     編輯:關於VC++

開發對話方塊型應用程式時,預設會在工作列顯示圖示。有讀者嘗試依 MSDN 文件設定 WS_EX_TOOLWINDOW 延伸視窗樣式卻失效。經深入研究,發現單靠此樣式無法對對話方塊生效,必須結合三個條件:

  1. 對話方塊必須建立為某個不可見框架視窗的子視窗;
  2. 該不可見框架視窗的延伸樣式必須設定 WS_EX_TOOLWINDOW;
  3. 確保對話方塊本身未設定 WS_EX_APPWINDOW 延伸樣式。

完整實作範例:HideDlg 專案

範例程式結構簡單,標頭與實作合於單一檔案。關鍵程式碼解析:

1. 主框架視窗設定 WS_EX_TOOLWINDOW

class CMainFrame : public CFrameWnd {
protected:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
};

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
    if (CFrameWnd::PreCreateWindow(cs)) {
        cs.dwExStyle |= WS_EX_TOOLWINDOW; // 關鍵:設定工具視窗樣式
        return TRUE;
    }
    return FALSE;
}

在 PreCreateWindow 中設定延伸樣式,使框架視窗不出現在工作列。因框架視窗不可見,標題列大小無關緊要。

2. 應用程式初始化:建立不可見框架做為對話方塊父視窗

BOOL CMyApp::InitInstance() {
    CMainFrame* pFrame = new CMainFrame;
    m_pMainWnd = pFrame;
    pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPED, NULL, NULL);
    
    CMyDlg dlg(pFrame); // 以不可見框架為父視窗
    int nResponse = dlg.DoModal();
    return FALSE; // 對話方塊結束即退出
}

即使框架不可見,資源檔仍需給它一個選單,否則 MFC 會報錯。

3. 移除對話方塊的 WS_EX_APPWINDOW

預設 VC++ 專案資源檔(.rc)中對話方塊常含 EXSTYLE WS_EX_APPWINDOW,此樣式會強制顯示於工作列,必須手動移除:

// 在對話方塊 OnInitDialog 中測試效果
// ModifyStyleEx(0, WS_EX_APPWINDOW); // 加上這行將導致隱藏失效

直接編輯 .rc 檔刪除該行,或確保程式碼中未設定此樣式。

原理深度解析

理論上,建立隱藏父視窗(WS_EX_TOOLWINDOW)是為了讓對話方塊保有標準標題列;若接受較小的工具視窗標題,甚至可不設 WS_EX_TOOLWINDOW,但 WS_EX_APPWINDOW 一定要關閉。實測僅關閉 WS_EX_APPWINDOW 即可隱藏,說明 WS_EX_TOOLWINDOW 非決定性因素。歡迎有更多經驗的開發者交流補充。

完整原始碼結構

範例包含 CMainFrame(不可見框架)、CMyDlg(主對話方塊)、CAboutDlg(關於對話方塊)、CMyApp(應用程式類別),完整展示 MFC 訊息對應、圖示設定、系統命令處理等細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved