VS2010 如何修改程序菜单字体大小?
在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.