在VS 2008之前的MFC版本,自定義菜單字體是一件比較繁瑣的事情,常規的做法是自繪菜單項,即定義一個CMenu的派生類,重載MeasureItem和重載DrawItem兩個函數。我發現利用VS2008 Feature Pack可以很輕易地做到這件事。具體就是使用CMFCMenuBar類的接口SetMenuFont函數,SetMenuFont已包含了自繪操作,即調用后立即更新菜單欄。下面是一個簡單的使用例子:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// 設置菜單欄字體大小
LOGFONT m_lf;
memset(&m_lf, 0, sizeof(LOGFONT));
m_lf.lfHeight = 16;
_tcsncpy_s(m_lf.lfFaceName, LF_FACESIZE, _T("Arial"), 7);
m_wndMenuBar.SetMenuFont(&m_lf);
// end
}
LOGFONT是Windows內部字體的邏輯結構,主要用於設置字體格式,其定義如下:
typedef struct tagLOGFONTA
{
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;
CHAR lfFaceName[LF_FACESIZE];
} LOGFONTA
其各個字段的含義如下:
lfHeight:指定邏輯單位的字符或者字符元高度
lfWidth:指定邏輯單位的字體字符的平均寬度
lfEscapement:指定每行文本輸出時相對於設備x軸的角度,其單位為1/10度
lfOrientation:指定字符基線相對於設備x軸的角度,其單位為1/10度。此值在Win9X中和lfEscapement具有相同的值,而在WinNT下有時候可能不同
lfWeight:指定字體的重量,Windows中字體重量表示字體的粗細程度,其范圍在0~1000之間,正常為400,粗體為700,若此值為空,則使用默認的字體重量
lfItalic:此值為TRUE時,字體為斜體
lfUnderline:此值為TRUE時,字體帶下划線
lfStrikeOut:此值為TRUE時,字體帶刪除線
lfCharSet:指定所使用的字符集,如GB2312_CHARSET,CHINESEBIG5_CHARSET等
lfOutPrecision:指定輸出精度,它定義了輸出與所要求的字體高度、寬度、字符方向及字體類型等相接近的程度
lfClipPrecision:指定剪輯精度,它定義了當字符的一部分超過剪輯區域時對字符的剪輯方式
lfQuality:指定輸出質量,它定義了GDI在匹配邏輯字體屬性到實際的物理字體時所使用的方式
lfPitchAndFamily:指定字體的字符間距和族
lfFaceName:指向NULL結尾的字符串的指針,此字符串即為所使用的字體名稱,其長度不能超過32個字符,如果為空,則使用系統默認的字體
CMFCMenuBar::SetMenuFont
Sets the font for all menu bars in your application.
static BOOL SetMenuFont(
LPLOGFONT lpLogFont,
BOOL bHorz = TRUE
);
- [in] lpLogFont
-
A pointer to aLOGFONTstructure that defines the font to set.
- [in] bHorz
-
TRUE if you want thelpLogFontparameter to be used for the vertical font, FALSE if you want it to be used for horizontal font.
Two fonts are used for allCMFCMenuBarobjects. These separate fonts are used for horizontal and vertical menu bars.
The font settings are global variables and affect allCMFCMenuBarobjects.