3.字體對話框
CFontDialog類的構造函數
3.1構造函數原型如下:
CFontDialog(
LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
CDC* pdcPrinter = NULL,
CWnd* pParentWnd = NULL
);
參數說明:
lplfInitial:指向LOGFONT結構體數據的指針,可以通過它設置字體的一些特徵。
dwFlags:指定選擇字體的一個或多個屬性,詳情可在MSDN中查閱。
pdcPrinter:指向一個打印設備上下文的指針。
pParentWnd:指向字體對話框父窗口的指針。
上面的構造函數中第一個參數爲LOGFONT指針,LOGFONT結構體中包含了字體的大部分特徵,包括字體高度、寬度、方向、名稱等等。
此結構體的定義:
typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
3.2獲取字體對話框中所選字體
我們在字體對話框中選擇了字體後,如何獲取選定的字體呢?我們可以通過CFontDialog類的成員變量m_cf間接獲得選定字體的CFont對象。m_cf是CHOOSEFONT類型的變量,CHOOSEFONT結構體定義如下:
typedef struct {
DWORD lStructSize;
HWND hwndOwner;
HDC hDC;
LPLOGFONT lpLogFont;
INT iPointSize;
DWORD Flags;
COLORREF rgbColors;
LPARAM lCustData;
LPCFHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
HINSTANCE hInstance;
LPTSTR lpszStyle;
WORD nFontType;
INT nSizeMin;
INT nSizeMax;
} CHOOSEFONT, *LPCHOOSEFONT;
CHOOSEFON結構體中有個成員lpLogFont,它是指向LOGFONT結構體變量的指針,就像上面所說,LOGFONT中包含了字體特徵,例如,我們可以通過LOGFONT的lfFaceName得知字體名。我們最終要獲得的是所選擇字體的CFont對象,有了字體的LOGFONT怎樣獲得對應的CFont對象呢?使用CFont類的成員函數CreateFontIndirect可以達到此目的。函數原型如下:
BOOL CreateFontIndirect(const LOGFONT* lpLogFont );
參數是LOGFONT指針類型,我們可以傳入CFontDialog類成員變量m_cf的lpLogFont成員,就可以得到所選字體的CFont對象了。
3.3 字體對話框應用實例
在類中爲CExample18Dlg類添加private成員變量:CFont m_font;,用來保存編輯框中選擇的字體。
修改消息處理函數OnBnClickedFontButton()
void CExample18Dlg::OnBnClickedFontButton()
{
// TODO: Add your control notification handler code here
CString strFontName; // 字體名稱
LOGFONT lf; // LOGFONT變量
// 將lf所有字節清零
memset(&lf, 0, sizeof(LOGFONT));
// 將lf中的元素字體名設爲“宋體”
_tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋體"));
// 構造字體對話框,初始選擇字體名爲“宋體”
CFontDialog fontDlg(&lf);
if (IDOK == fontDlg.DoModal()) // 顯示字體對話框
{
// 如果m_font已經關聯了一個字體資源對象,則釋放它
if (m_font.m_hObject)
{
m_font.DeleteObject();
}
// 使用選定字體的LOGFONT創建新的字體
m_font.CreateFontIndirect(fontDlg.m_cf.lpLogFont);
// 獲取編輯框IDC_FONT_EDIT的CWnd指針,並設置其字體
GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font);
// 如果用戶選擇了字體對話框的OK按鈕,則獲取被選擇字體的名稱並顯示到編輯框裏
strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;
SetDlgItemText(IDC_FONT_EDIT, strFontName);
}
}