MFC 字体对话框

字体对话框作用是用来选择字体一般模态对话框。

<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的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值