VS2010/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结构体中包含了字体的大部分特征,包括字体高度、宽度、方向、名称等等。下面是此结构体的定义:
<pre class="cpp" name="code"> 
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工程,名字为“Test”。
       2.在自动生成的主对话框IDD_TSET_DIALOG的模板中,删除“TODO: Place dialog controls here.”静态文本框,添加一个按钮,ID设为IDC_FONT_BUTTON,Caption设为“字体选择”,用于显示字体对话框来选择字体,再添加一个编辑框,ID设为IDC_FONT_EDIT,用来以所选字体显示字体名字符串。
       3.在TestDlg.h中为CTestDlg类添加private成员变量:CFont m_font;,用来保存编辑框中选择的字体。
       4.为按钮IDC_FONT_BUTTON添加点击消息的消息处理函数CTestDlg::OnBnClickedFontButton()。
       5.修改消息处理函数CTestDlg::OnBnClickedFontButton()如下:
 

void CTestDlg::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);   
    	}  
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值