目前在学习MFC的过程中,初学使用鸡啄米的教程学习(向鸡啄米致敬),一边学习,一边应用,以及一边总结学习过程中所遇到的各个问题。
这篇主要解析鸡啄米字体格式设置里面所用到的各个函数,由于水平有限,难免会出现错误,望指正。
鸡啄米MFC教材字体格式设置函数解析
Author:Meteor
函数实现如下:
void CWORDDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
CString strFontName;
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
_tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋体"));
CFontDialog fontDlg(&lf);
if (IDOK == fontDlg.DoModal())
{
if (m_font.m_hObject)
{
m_font.DeleteObject();
}
m_font.CreateFontIndirect(fontDlg.m_cf.lpLogFont);
GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font);
strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;
SetDlgItemText(IDC_FONT_EDIT, strFontName);
}
}
CString strFontName;设置变量,用来存放我们所设置的字体格式的相关参数
LOGFONT lf; LOGFONT:结构体变量,结构体是字体格式相关的,比如大小,字体格式,颜色等参数
memset(&lf, 0, sizeof(LOGFONT));
memset函数定义如下:
所以这一步的实际意义是将之前定义的lf结构体进行一个初始赋值动作,实际上是将其全部写0
_tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋体"));
_tcscpy_s,是一个宏定义,找到其定义的地方:#define _tcscpy_s wcscpy_s
那么实质上调用的就是wcscpy_s,该函数原型:
errno_t wcscpy_s(
wchar_t *strDestination,
size_t numberOfElements,
const wchar_t *strSource
);
详细说明如下
Parameters
strDestination
Location of destination string buffer
numberOfElements
Size of the destination string buffer.
strSource
Null-terminated source string buffer.
其中原函数LF_FACESIZE 为 #define LF_FACESIZE 32
最后,可以看出原函数的功能是将该lf 字体设置为宋体
CFontDialog fontDlg(&lf);
构造字体对话框,字体格式便是之前所定义的宋体,其中CFontDialog是一个库类,就是字体对话框的库类,具体结构可以查看MSDN,此处不做说明。
if (IDOK == fontDlg.DoModal())弹出对话框
if (m_font.m_hObject)
{
m_font.DeleteObject();
}
这一句是指当也有字体对象时,删除他(我们在第二次设置字体格式时,所做动作就有这个,删除前一个设置的字体格式,具体函数实现参考MSDN)
m_font.CreateFontIndirect(fontDlg.m_cf.lpLogFont);
CreateFontIndirect()函数意义如下:
Initializes a CFont object with the characteristics given in a LOGFONT structure pointed to by lpLogFont.
即使用选定字体的 LOGFONT 创建新的字体
GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font);
获取定义的编辑框里面的CWnd,并且设置字体。
strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;
当字体对话框键入OK按钮时,将字体格式变量赋值给 strFontName
SetDlgItemText(IDC_FONT_EDIT, strFontName);
把我们所设置的字体格式写入到编辑框内
Thanks for your reading