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

屬性頁整合字型對話框:自訂 CFontPropertyPage 實作指南

     編輯:關於C語言

背景與動機

MFC 提供 CFontPropPage、CColorPropPage、CPicturePropPage 僅支援 OLE 自動化。一般屬性表 (CPropertySheet) 若需字型選擇頁,需自行實作。

資源準備:複製系統字型對話框模板

  1. 系統字型對話框模板位於 SDK include 目錄 font.dlg,符號定義在 dlgs.h。
  2. 在 Visual Studio 資源編輯器開啟 font.dlg (或同目錄 fontpage.rc),複製 IDD_FONTPAGE 對話框資源到專案 .rc。
  3. 或將 fontpage.rc/fontpagerc.h 複製到專案 res 目錄,在專案 .rc2 中 #include "fontpage.rc"。

對話框資源結構 (IDD_FONTPAGE)

  • 字型清單:IDC_FONT (ComboBox, CBS_SIMPLE|CBS_SORT|WS_VSCROLL)
  • 樣式清單:IDC_STYLE (ComboBox)
  • 大小清單:IDC_FONTSIZE (ComboBox)
  • 效果群組:IDC_STRIKEOUT、IDC_UNDERLINE (CheckBox)
  • 範例區域:IDC_SAMPLE (Static, SS_NOPREFIX)

CFontPropertyPage 類別實作


class CFontPropertyPage : public CPropertyPage {
    DECLARE_DYNCREATE(CFontPropertyPage)
public:
    CFontPropertyPage(LPLOGFONT pLogFont = NULL); // 傳入初始 LOGFONT
    virtual ~CFontPropertyPage();

    LOGFONT m_logFont; // 內部字型狀態

protected:
    virtual void DoDataExchange(CDataExchange* pDX);
    virtual BOOL OnInitDialog();
    afx_msg void OnSelChange(); // 所有清單變更統一處理
    DECLARE_MESSAGE_MAP()
};

建構函式


CFontPropertyPage::CFontPropertyPage(LPLOGFONT pLogFont)
    : CPropertyPage(IDD_FONTPAGE) {
    if (pLogFont) m_logFont = *pLogFont;
    else {
        // 取得預設視窗字型
        CFont* pFont = CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT));
        pFont->GetLogFont(&m_logFont);
    }
}

OnInitDialog 初始化清單


BOOL CFontPropertyPage::OnInitDialog() {
    CPropertyPage::OnInitDialog();

    // 列舉系統字型填充 IDC_FONT
    CClientDC dc(this);
    EnumFontFamiliesEx(dc.m_hDC, &m_logFont, (FONTENUMPROC)FontEnumProc, (LPARAM)this, 0);

    // 根據 m_logFont 設定初始選取項目
    // ... 設定 IDC_STYLE, IDC_FONTSIZE 對應項目 ...

    // 更新範例文字
    UpdateSampleText();
    return TRUE;
}

OnSelChange 統一處理變更


void CFontPropertyPage::OnSelChange() {
    // 從三個 ComboBox 讀取選取項目,更新 m_logFont
    // 字型名稱 → m_logFont.lfFaceName
    // 樣式 → m_logFont.lfWeight, lfItalic, lfUnderline, lfStrikeOut
    // 大小 → m_logFont.lfHeight (邏輯單位轉換)
    // 更新範例文字顯示
    UpdateSampleText();
}

UpdateSampleText 繪製範例


void CFontPropertyPage::UpdateSampleText() {
    CStatic* pSample = (CStatic*)GetDlgItem(IDC_SAMPLE);
    CFont font;
    font.CreateFontIndirect(&m_logFont);
    pSample->SetFont(&font); // 注意:font 為區域變數,需改為成員變數 m_fontSample
    pSample->SetWindowText(_T("AaBbYyZz"));
}

整合至屬性表


CPropertySheet sheet(_T("字型設定"));
CFontPropertyPage fontPage(&initialLogFont);
sheet.AddPage(&fontPage);
if (sheet.DoModal() == IDOK) {
    // 使用 fontPage.m_logFont 建立字型
    CFont font;
    font.CreateFontIndirect(&fontPage.m_logFont);
    // 套用至目標視窗/控制項
}

擴充建議

  • 支援腳本/字元集選擇 (lfCharSet)。
  • 加入字型預覽區域 (大字樣、多行文字)。
  • 整合 CHOOSEFONT 通用對話框旗標 (CF_EFFECTS, CF_SCRIPTSONLY 等)。
  • 高 DPI 下字型大小單位換算 (lfHeight 為邏輯單位,MulDiv 轉換點數)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved