MFC 提供 CFontPropPage、CColorPropPage、CPicturePropPage 僅支援 OLE 自動化。一般屬性表 (CPropertySheet) 若需字型選擇頁,需自行實作。
include 目錄 font.dlg,符號定義在 dlgs.h。font.dlg (或同目錄 fontpage.rc),複製 IDD_FONTPAGE 對話框資源到專案 .rc。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 等)。lfHeight 為邏輯單位,MulDiv 轉換點數)。