前言
使用這個類可以很容易在窗口或對話框中加入各種額外的字體。我們可以通過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;
}
};
本文配套源碼