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

WTL 字型按鈕類別 CFontButton 與 CDialogResize 自適應對話框實作

     編輯:關於VC++

本文介紹兩個 WTL 實用技術:CDialogResize 模板類別實現對話框拖曳調整大小與控制項自動佈局,以及移植自 MFC 的 CFontButton 類別實現立體字型按鈕效果(僅支援英文字型)。

CDialogResize:對話框自適應佈局三步驟

  1. 繼承模板基類:
    class CMainDlg : public CDialogImpl<CMainDlg>, public CDialogResize<CMainDlg> { ... };
  2. 定義控制項調整規則:
    BEGIN_DLGRESIZE_MAP(CMainDlg)
        DLGRESIZE_CONTROL(IDC_BUTTON1, DLSZ_SIZE_X | DLSZ_MOVE_Y)
        DLGRESIZE_CONTROL(IDC_LIST1, DLSZ_SIZE_X | DLSZ_SIZE_Y)
    END_DLGRESIZE_MAP()

    旗標定義:DLSZ_SIZE_X/Y(隨對話框縮放)、DLSZ_MOVE_X/Y(隨對話框移動)、DLSZ_REPAINT(重繪)

  3. 初始化啟用:OnInitDialog() 中呼叫 DlgResize_Init()

CFontButton:WTL 自繪按鈕實現

核心架構:COwnerDraw 模板類別

WTL 提供兩種自繪基類:

  • COwnerDraw:處理 WM_DRAWITEM、WM_MEASUREITEM、WM_COMPAREITEM、WM_DELETEITEM,支援 Button、ComboBox、ListBox、ListView、Menu
  • CCustomDraw:處理 NM_CUSTOMDRAW,支援 Header、ListView、Rebar、Toolbar、Tooltip、TrackBar、TreeView

訊息對應鏈結兩種模式

// 模式一:父視窗處理(傳統 MFC 風格)
class CXXXDlg : public COwnerDraw<CXXXDlg> {
    BEGIN_MSG_MAP(CXXXDlg)
        CHAIN_MSG_MAP(COwnerDraw<CXXXDlg>)
    END_MSG_MAP()
    void DrawItem(LPDRAWITEMSTRUCT lpdis);
};

// 模式二:控制項自我處理(本範例採用)
class CFontButtonImpl : public COwnerDraw<CFontButtonImpl> {
    BEGIN_MSG_MAP(CFontButtonImpl)
        CHAIN_MSG_MAP_ALT(COwnerDraw<CFontButtonImpl>, 1)
        DEFAULT_REFLECTION_HANDLER()
    END_MSG_MAP()
    void DrawItem(LPDRAWITEMSTRUCT lpdis);
};

視窗特徵定義

typedef CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0> CControlWinTraits;

專案整合使用

  1. 加入 FontButton.h
  2. 宣告變數:CFontButtonCtrl m_FontButton;
  3. 子類化現有按鈕:m_FontButton.SubclassWindow(GetDlgItem(IDC_BUTTON_FONT1));

WTL 學習心得

WTL 雖輕量但功能完整,CDialogResize 與 COwnerDraw 等模板類別展現了現代 C++ 模板元程式設計在視窗開發的優雅應用。原始碼可讀性高,建議開發者深入研讀 atlframe.h、atlctrls.h 等核心標頭檔,掌握 WTL 設計精髓。

總結

本文提供 WTL 兩大實用技術的完整整合指南:CDialogResize 解決對話框佈局痛點,CFontButton 展示 WTL 自繪控制項開發模式。程式碼簡潔、無 MFC 相依,適合追求輕量級應用的專案採用。

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