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

MFC 對話框 Edit 控件字體修改完整指南:CFont 創建與 SetFont 應用

     編輯:關於C語言

MFC 對話框 Edit 控件字體修改完整指南:CFont 創建與 SetFont 應用

前言

在 MFC 對話框應用中,修改 Edit、Static 等控件字體是常見需求。本文提供兩種創建字體的方法,並詳細說明字體對象生命周期管理的關鍵細節。

一、方法一:CreatePointFont (推薦,簡單)

1. 頭文件聲明


// MyDialog.h
class CMyDialog : public CDialogEx {
    // ...
protected:
    CFont m_Font;  // 成員變量:隨對話框生命周期
    CEdit m_ControlEdit;  // DDX_Control 綁定的控件變量
};

2. OnInitDialog 初始化


// MyDialog.cpp
BOOL CMyDialog::OnInitDialog() {
    CDialogEx::OnInitDialog();
    
    // 創建字體:150 = 15 點 (單位:0.1點), "華文行楷"
    m_Font.CreatePointFont(150, _T("華文行楷"), NULL);
    
    // 應用到控件
    m_ControlEdit.SetFont(&m_Font, FALSE);  // FALSE = 不立即重繪
    
    return TRUE;
}

關鍵點

  • CFont m_Font 必須作為類成員變量,不能在函數內部定義局部變量 (離開作用域會析構,導致控件使用無效字體)
  • CreatePointFont 參數:nPointSize (0.1點為單位)、字體名稱、可選 CDC*
  • SetFont 第二參數 bRedraw:TRUE 立即重繪,FALSE 延後 (推薦在 OnInitDialog 用 FALSE)

二、方法二:CreateFont (完全控制)


BOOL CMyDialog::OnInitDialog() {
    CDialogEx::OnInitDialog();
    
    // 完整參數創建
    m_Font.CreateFont(
        -11,        // nHeight: 負值 = 字符高度 (含內部間距), 正值 = 輸出高度
        0,          // nWidth: 0 = 自動匹配最寬字符
        0,          // nEscapement: 字符基線與水平線夾角 (0.1度)
        0,          // nOrientation: 字符內部傾斜角度
        FW_NORMAL,  // nWeight: 粗細 (FW_DONTCARE/THIN/NORMAL/BOLD/HEAVY)
        FALSE,      // bItalic: 斜體
        FALSE,      // bUnderline: 下劃線
        0,          // cStrikeOut: 刪除線
        ANSI_CHARSET, // nCharSet: 字符集
        OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY,
        FF_SWISS,   // nPitchAndFamily: 變寬字體 + 瑞士字體族
        _T("Arial") // lpszFacename: 字體名稱
    );
    
    // 獲取控件指針並設置
    CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
    if (pEdit) pEdit->SetFont(&m_Font, FALSE);
    
    return TRUE;
}

CreateFont 關鍵參數表

參數常用值說明
nHeight-12, -16, -20負值 = 字符高度 (推薦),對應點數約為 |nHeight| * 72 / 96
nWeightFW_NORMAL(400), FW_BOLD(700)FW_DONTCARE(0) 到 FW_HEAVY(900)
bItalicTRUE/FALSE斜體
bUnderlineTRUE/FALSE下劃線
cStrikeOutTRUE/FALSE刪除線
nCharSetANSI_CHARSET, DEFAULT_CHARSETGB2312 中文用 DEFAULT_CHARSET 或 CHINESEBIG5_CHARSET
nPitchAndFamilyFF_DONTCARE | DEFAULT_PITCH高 4 位字體族,低 4 位字符間距

三、常見錯誤與避坑

錯誤代碼現象原因修正
CFont m_Font; // 局部變量字體不生效/程式崩潰對象析構,HFONT 失效改為類成員變量
SetFont(&m_Font, TRUE)閃爍/重繪異常OnInitDialog 中多次重繪用 FALSE,最後統一 Invalidate
CreateFont 高度正值字體過大/不準確正值 = 輸出高度 (含外部間距)用負值指定字符高度
字體名稱拼寫錯誤使用系統默認字體CreateFont 失敗靜默回退用 EnumFontFamiliesEx 驗證名稱

四、動態修改字體 (運行時切換)


void CMyDialog::OnButtonChangeFont() {
    // 刪除舊字體 (可選,CFont 析構會自動 DeleteObject)
    // m_Font.DeleteObject();  
    
    // 創建新字體
    m_Font.CreatePointFont(200, _T("微軟雅黑"));
    
    // 重新應用
    m_ControlEdit.SetFont(&m_Font, TRUE);  // 立即重繪
    
    // 可選:調整控件大小適應新字體
    CRect rect;
    m_ControlEdit.GetClientRect(&rect);
    CClientDC dc(&m_ControlEdit);
    CFont* pOld = dc.SelectObject(&m_Font);
    CSize sz = dc.GetTextExtent(_T("測試文本"));
    dc.SelectObject(pOld);
    m_ControlEdit.SetWindowPos(NULL, 0, 0, sz.cx + 10, sz.cy + 10, SWP_NOMOVE | SWP_NOZORDER);
}

五、總結

  1. 字體對象生命周期 ≥ 控件使用周期:必須用成員變量 CFont m_Font
  2. 優先用 CreatePointFont:參數少、單位直觀 (0.1點)、自動處理 DPI
  3. 需精細控制用 CreateFont:支持傾斜、粗細、字符集、字體族全參數
  4. SetFont 後建議 Invalidate:確保視覺及時更新

掌握 MFC 字體自定義,能讓你的對話框界面更專業、更符合品牌視覺規範。

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