文字对话框
字体对话框的作用是用来选择字体。MFC使用CFontDialog类封装了字体对话框的所有操作。字体对话框也是一种模态对话框。
CFontDialog类的构造函数
常用构造函数原型如下: 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;
获取字体对话框中所选字体
可以通过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对象了。
步骤:
1.创建一个基于对话框的MFC工程,FontDlg。
2.在自动生成的主对话框中,添加一个按钮,ID设为IDC_BTN_FONT,Caption设为“选择”,用于显示字体对话框来选择字体,再添加一个编辑框,ID设为IDC_EDT_FONT,用来以所选字体显示字体名字符串。
3.在FontDlg.h中为FontDlg类添加private成员变量:CFont m_font;,用来保存编辑框中选择的字体。
4.为按钮IDC_BTN_FONT添加点击消息的消息处理函数void
CFontDlgDlg::OnBnClickedBtnFont()
5.修改消息处理函数CFontDlgDlg::OnBnClickedBtnFont()如下:
void CFontDlgDlg::OnBnClickedBtnFont() { { 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_BTN_FONT)->SetFont(&m_font); // 如果用户选择了字体对话框的OK按钮,则获取被选择字体的名称并显示到编辑框里 strFontName = fontDlg.m_cf.lpLogFont->lfFaceName; SetDlgItemText(IDC_EDT_FONT, strFontName); } } }
6.最后,编译运行程序。显示结果对话框:
。。。。。。。。。。。。。。。。。。。。。。。。。结束。。。。。。。。。。。。。。。。。。