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

打造統一風格漂亮介面 (二):對話框子類化與統一風格模板實作

     編輯:VC 教學

前言:統一風格的挑戰

上一篇介紹了自繪視窗標題列、邊框、系統按鈕的基本原理。但實際專案中,最大的挑戰在於如何讓所有視窗(主視窗、子對話框、屬性頁等)擁有統一風格。Windows 系統預設視窗風格一致,但 MFC 的 CDialog 若要徹底改變外觀極其困難,除非深入 MFC 核心甚至作業系統核心。作者經過無數次嘗試,終找到可行方案:建立自訂基底對話框類別 CTitleBarDlg,所有業務對話框繼承它而非 CDialog。

核心實作步驟

1. 建立統一風格主視窗

主視窗同樣是一個對話框,參考上一篇自繪標題列、邊框、按鈕的方法完成。重點在 OnInitDialog() 的處理:

BOOL CTitleBarDlg::OnInitDialog()
{
    // 嚴禁在此處修改/新增程式碼!子類別的 OnInitDialog 依賴此流程
    m_ToolTip.Create(this, TTS_ALWAYSTIP);
    m_ReSizeFlag = TRUE;

    CRect rtWnd;
    GetClientRect(&rtWnd);
    m_OldWidth = rtWnd.Width();
    m_OldHeight = rtWnd.Height();
    OldPoint.x = rtWnd.Width();
    OldPoint.y = rtWnd.Height();

    if (!m_BaseFlag) {
        m_BaseFlag = TRUE;
        CDialog::OnInitDialog();

        // ************************************
        // 僅允許在這裡修改/新增主視窗專屬初始化碼
        // ************************************
    }
    return TRUE;
}

2. 建立業務對話框並修改繼承關係

  1. 使用資源編輯器設計對話框模板,ClassWizard 產生 CYourDlg(基類為 CDialog)。
  2. 將 YourDlg.h 與 YourDlg.cpp 中所有 CDialog 替換為 CTitleBarDlg(建議用「取代」功能)。
  3. 在 YourDlg.h 加入 #include "TitleBarDlg.h"。
  4. 關鍵:建構函式第一個參數 CTitleBarDlg nID 必須刪除,否則無法編譯通過。

3. 顯示子視窗(僅支援非模態)

// 顯示代碼範例
CYourDlg* pMyDlg = new CYourDlg;
pMyDlg->Create(IDD_YOUR_DLG);
pMyDlg->ShowWindow(SW_SHOW);
// 注意:必須在適當時機 delete pMyDlg 避免記憶體洩漏
// 若使用 DoModal() 目前尚未成功,歡迎高手提供解法

現存限制與解決方案

  1. 統一風格視窗必須為主視窗,尚無法獨立存在。
  2. 子視窗僅支援非模態顯示,DoModal() 會導致風格失效。
  3. 基於上述原因,作者建立了統一介面風格開發模板,僅在此架構下開發才能保證風格一致。

視窗訊息處理對照表

訊息用途
WM_NCPAINT重繪非客戶區(標題列、邊框),可自繪標題列任意內容
WM_NCLBUTTONDOWN非客戶區滑鼠左鍵按下(如標題列按鈕點擊)
WM_NCMOUSEMOVE非客戶區滑鼠移動(懸停效果、按鈕熱追蹤)
WM_SIZE視窗大小改變,調整內部控件位置與大小

總結與展望

透過 CTitleBarDlg 基底類別,成功實現了主視窗與非模態子對話框的統一風格。雖然模態對話框與獨立視窗仍有限制,但此架構已滿足大多數業務應用需求。後續將探討:將設計好的漂亮視窗子類化、美化其他控件(編輯框、列表框等)、控件隨視窗自動調整大小。敬請期待。

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