WTL字体类
翻译/南京中萃食品有限公司(210061) 肖进
原作/Robert Edward Caldecott
来源:www.codeproject.com
下载源代码
前言
使用这个类可以很容易在窗口或对话框中加入各种额外的字体。我们可以通过CWindowFont类建立一个基于当前窗口的新字体。你所要做的就是设置字体属性(加重、斜体等),来美化你的程序。例如,在程序中一个使用加重字体的静态控件。
在WTL对话框中使用该类,只需简单地进行如下操作。首先加入头文件:
#include "windowfont.h"然后,为每一个待创建的字体加入一个CWindowsFont成员变量。
...CWindowFont m_fontBold;然后,在对话框中的OnInitDialog函数中, 直接在对话框中的控件上应用新字体风格。
// 建立字体,应用在静态控件 IDC_TEXT 上m_fontBold.Apply(m_hWnd, CWindowFont::typeBold, IDC_TEXT);调用Create函数创建字体,调用控件的SetFont函数。
//建立加重字体if (m_fontBold.Create(m_hWnd, CWindowFont::typeBold)) GetDlgItem(IDC_TEXT).SetFont(m_fontBold);非常简单!通常,我在每个程序的关于框内使用这个类去显示程序的版本信息。如图一所示。另外我还常在向导首页上使用该类来建立两倍高度的字体,以美化窗口外观。
图一
说明
类中字体可以设置为以下风格 ,也可以对它们进行或操作:
加重Bold (CWindowFont::typeBold) 斜体Italic (CWindowFont::typeItalic) 下划线 (CWindowFont::typeUnderline) 两倍高度 (CWindowFont::typeDoubleHeight)CWindowFont部分源码
CWindowFont类的部分源码如下所示:
#pragma once#include // LOGFONT 结构的包裹类class CLogFont : public LOGFONT{public: CLogFont() { memset(this, 0, sizeof(LOGFONT)); }};// 建立基于指定窗口的字体class CWindowFont : public CFont {public: //字体风格 typedef enum tagEType { typeNormal = 0x00, typeBold = 0x01, typeItalic = 0x02, typeUnderline = 0x04, typeDoubleHeight = 0x08, } EType;public: CWindowFont() : CFont() { } /// hWnd -窗口句柄 /// nType - 字体风格 CWindowFont(HWND hWnd, int nType) { // HWND不能为NULL ATLASSERT(hWnd != NULL); //创建字体 Create(hWnd, nType); } virtual ~CWindowFont() { }public: //创建字体 // hWnd -窗口句柄 // nType -字体风格 //成功则返回TRUE bool Create(HWND hWnd, int nType) { // 窗口句柄不能为NULL ATLASSERT(hWnd != NULL); ATLASSERT(::IsWindow(hWnd) != FALSE); // 获得当前窗口的字体 HFONT hFont = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0); // 是否获得当前字体成功? if (hFont == NULL) return false; CLogFont lf; // 填充 LOGFONT结构 if (::GetObject(hFont, sizeof(lf), &lf) == 0) return false; // 分离LOGFONT成员变量 if (nType & typeBold) lf.lfWeight = FW_BOLD; if (nType & typeItalic) lf.lfItalic = TRUE; if (nType & typeUnderline) lf.lfUnderline = TRUE; if (nType & typeDoubleHeight) lf.lfHeight *= 2; // 建立新字体 return CreateFontIndirect(&lf) ? true : false; } //建立新字体并应用到控件上去 bool Apply(HWND hWnd, int nType, UINT nControlID) { // 先建立字体 if (!Create(hWnd, nType)) return false; // 应用到控件上 CWindow wndControl = ::GetDlgItem(hWnd, nControlID); ATLASSERT(wndControl != NULL); wndControl.SetFont(m_hFont); return true; }};