我使用通用字体对话框获得字体和字体的大小,单这种情况下字体的是得到了,但字体的大小是负值,请问这个问题怎么解决?
具体代码如下:
TCHAR* PopFontChooseDialog(const HWND& hWnd, LOGFONT& LogFont)
{
CHOOSEFONT cf;
ZeroMemory(&cf, sizeof(cf));
cf.lStructSize = sizeof (CHOOSEFONT);
cf.hwndOwner = NULL;
cf.hDC = NULL;
cf.lpLogFont = &LogFont;
cf.iPointSize = 0;
cf.Flags = CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS|CF_NOSTYLESEL;
cf.rgbColors = 0;
cf.lCustData = 0;
cf.lpfnHook = NULL;
cf.lpTemplateName = NULL;
cf.hInstance = NULL;
cf.lpszStyle = NULL;
cf.nFontType = SCREEN_FONTTYPE;
cf.nSizeMin = 0;
cf.nSizeMax = LogFont.lfHeight; ChooseFont(&cf);
// 执行完这句后LogFont.lfHeight的值是个负数,请问怎样才能呢个得到正确的字体大小?
return cf.lpLogFont->lfFaceName;
}
具体代码如下:
TCHAR* PopFontChooseDialog(const HWND& hWnd, LOGFONT& LogFont)
{
CHOOSEFONT cf;
ZeroMemory(&cf, sizeof(cf));
cf.lStructSize = sizeof (CHOOSEFONT);
cf.hwndOwner = NULL;
cf.hDC = NULL;
cf.lpLogFont = &LogFont;
cf.iPointSize = 0;
cf.Flags = CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS|CF_NOSTYLESEL;
cf.rgbColors = 0;
cf.lCustData = 0;
cf.lpfnHook = NULL;
cf.lpTemplateName = NULL;
cf.hInstance = NULL;
cf.lpszStyle = NULL;
cf.nFontType = SCREEN_FONTTYPE;
cf.nSizeMin = 0;
cf.nSizeMax = LogFont.lfHeight; ChooseFont(&cf);
// 执行完这句后LogFont.lfHeight的值是个负数,请问怎样才能呢个得到正确的字体大小?
return cf.lpLogFont->lfFaceName;
}
Value Meaning
> 0 The font mapper transforms this value into device units and matches it against the cell height of the available fonts.
0 The font mapper uses a default height value when it searches for a match.
< 0 The font mapper transforms this value into device units and matches its absolute value against the character height of the available fonts.
lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
//表明这个16号字体的绝对高度就是21
//font.lfheight和字号之间的关系:
//int add = (((-font.lfHeight) % 4) > 1)? 1:0;
//字号 = -font.lfHeight - ((-font.lfHeight) / 4) - add;
这是以逻辑单位表示的希望的字符高度。您可以将lfHeight设定0,以使用内定大小,或者根据字段代表的含义将其设定为正数或负数。如果将lfHeight设定为正数,就表示您希望该值表示含有内部间隔(不是外部间隔)的高度。实际上,所要求的字体行距为lfHeight。如果将lfHeight设定为负值,则Windows会将其绝对值作为与点值一致的字体高度。这是一个很重要的区别:如果想要特定点值的字体,可将点值转换为逻辑单位,并将lfHeight字段设定为该值的负数。如果lfHeight是正值,则TEXTMETRIC结构的tmHeight字段近似为该值(有时有微小的偏差,可能由于舍入误差所引起)。如果lfHeight是负值,则它粗略地与不包括tmInternalLeading字段的TEXTMETRIC结构的tmHeight字段相匹配。
static char *strFontSize[] =
{"初号","小初","一号","小一","二号","小二","三号","小三",
"四号","小四","五号","小五","六号","小六","七号","八号","5",
"5.5","6.5" ,"7.5", "8", "9", "10", "10.5","11", "12","14","16","18",
"20","22","24","26","28","36","48","72"};
static int nFontSizes[] =
{-56,-48,-35,-32,-29,-24,-21,-20,
-19,-16,-14,-12,-10,-9 ,-7, -6, -6,
-7, -9, -10,-11,-12,-13,-14,-15,-16,-19,-21,-24,
-27,-29,-32,-35,-37,-48,-64,-96};