字体对话框作用是用来选择字体一般模态对话框。
<1>CFontDialog类的构造函数
CFontDialog(
LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
CDC* pdcPrinter = NULL,
CWnd* pParentWnd = NULL
);
参数说明:
lplfInitial:指向LOGFONT结构体数据的指针,可以通过它设置字体的一些特征。
dwFlags:指定选择字体的一个或多个属性,详情可在MSDN中查阅。
pdcPrinter:指向一个打印设备上下文的指针。
pParentWnd:指向字体对话框父窗口的指针。
其中有一个LOGRONT: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;
lfFaceName 得知字体名
LF_FACESIZE 宏定义32
<2>获取选定字体
在对话框中选择了字体后,需要获得选定的字体。需要通过CFontDialog类的成员变量m_cf间接得到选定字体的CFont对象。那么m_cf是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;
lpLogFont 指向LOGFONT结构体变量的指针
m_cf是CFontDialog类的成员变量,是CHOOSEFONT类型变量
通过CFont类的成员函数CreateFontIndirectW可以实现,通过字体的LOGFONT获得对应的CFont对象。
BOOL CreateFontIndirect(const LOGFONT* lpLogFont );
<3>实现
设置一个按钮,一个编辑框用来显示选定的字体。
在“字体对话框.h”中为“字体对话框”类添加私有成员CFont m_font;
然后就是对按钮的消息处理函数进行改写,具体如下代码
void C字体对话框Dlg::OnBnClickedFontButton()
{
// TODO: 在此添加控件通知处理程序代码
CString strFontName;//用来显示在对话框中选择的字体
LOGFONT lf;//定义一个LOGFONT结构体变量
memset(&lf, 0, sizeof(LOGFONT));//清空lf
_tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("华文彩云"));//_tcscpy_c字符cpy函数,把lf的初始字体设置为华文云彩
CFontDialog fontDlg(&lf);//创建一个字体对话框,并对其进行初始化
if (IDOK == fontDlg.DoModal())//显示字体对话框
{
if (m_font.m_hObject)//如果m_font已经关联了一个字体资源对象,那么释放它
{
m_font.DeleteObject();
}
m_font.CreateFontIndirectW(fontDlg.m_cf.lpLogFont);//使用选定字体的LOGFONT创建新字体
GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font);//获得编辑框的CWnd指针,并设置字体
strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;//获得其名字,并显示在编辑框中
SetDlgItemText(IDC_FONT_EDIT, strFontName);
}
}
void C字体对话框Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnOK();
}
void C字体对话框Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnCancel();
}
单独难处一个来解释一下fontDlg.m_cf.lpLogFont->lfFaceName;
首先是调用了CFontDialog类的对象fontDlg,然后又调用而fontDlg里面的CHOOSEFONT类型的成员变量m_cf,然后CHOOSEFONT类型中有指向LOGFONT结构体变量的指针,然后此时即已经到了LOGFONT结构体这一层了,然后调用其中的lfFaceName来获得字体名字。
TIP:CFont类封装了一个Windows图形设备接口(GDI)字体,并为操作字体提供了成员函数。
GetDlgItem返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。