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

VC++ 統一風格自繪介面進階:基類封裝與多視窗一致性實現

     編輯:VC++

前言

上一篇實現單一視窗自繪,但實務專案需所有視窗統一風格。本文介紹如何將自繪邏輯封裝為基類 CTitleBarDlg,讓所有對話框繼承即可擁有一致外觀。

理論基礎:對話框與視窗的差異

  • SDK 層:對話框有專屬視窗程序 + 對話框程序
  • MFC 層:所有視窗共用 AfxWndProc,對話框只在 OnInitDialog 處理 WM_INITDIALOG
  • 自繪必須在視窗程序層攔截 WM_NCPAINT、WM_NCLBUTTONDOWN、WM_NCMOUSEMOVE、WM_SIZE

基類設計:CTitleBarDlg

1. OnInitDialog 範本方法模式

BOOL CTitleBarDlg::OnInitDialog()
{
    // 基類必要初始化 (不可修改)
    m_ToolTip.Create(this, TTS_ALWAYSTIP);
    m_bResizeFlag = TRUE;
    CRect rc; GetClientRect(&rc);
    m_OldSize = rc.Size();
    
    if (!m_BaseInitialized)
    {
        m_BaseInitialized = TRUE;
        CDialog::OnInitDialog(); // 呼叫 MFC 預設初始化
        
        // === 衍生類別只能在這裡加入自有初始化 ===
        // OnCustomInit(); // 可定義虛擬函式供衍生類覆寫
    }
    return TRUE;
}

2. 衍生類別修改步驟

  1. 用資源編輯器建立對話框模板,ClassWizard 產生 CYourDlg : public CDialog
  2. 將 CYourDlg.h/.cpp 中所有 CDialog 改為 CTitleBarDlg (含基類宣告、建構函式、訊息對應宏)
  3. #include "TitleBarDlg.h"
  4. 移除建構函式第一個參數 (原為 UINT nIDTemplate, CWnd* pParent,改為 CWnd* pParent)

3. 顯示非模態子視窗

CYourDlg* pDlg = new CYourDlg;
pDlg->Create(IDD_YOUR_DLG);
pDlg->ShowWindow(SW_SHOW);
// 注意:需自行管理記憶體,適當時機 delete pDlg

模態對話框 (DoModal) 目前不支援,因 MFC 內部對話框程序處理流程不同。若需模態效果,可用非模態 + Disable 父視窗模擬。

統一風格開發模板

作者已建立完整開發模板,包含:

  • CTitleBarDlg 基類完整原始碼
  • 標準化資源命名規範
  • 控制項自動佈局支援 (WM_SIZE 重排)
  • 專案精靈範本

需求者可聯繫作者取得。

已知問題與解決方向

問題原因解決方向
基類必須是主視窗鉤子機制依賴主視窗研究 SetWindowsHookEx 全域鉤子注入
僅支援非模態對話框模態對話框有獨立訊息迴圈模擬模態:非模態 + Disable 父視窗 + 訊息過濾
子類化控制項風格不一標準控制項繪製由系統接管Owner-draw / 自繪控制項封裝 (CButtonXP, CEditXP...)

結語

統一風格自繪介面已具雛形,後續將探討:控制項子類化、動態佈局管理、主題切換機制。歡迎交流指教。

原始碼請參考附件。聯繫:song_0962@sina.com / QQ: 34544052

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