我使用通用字体对话框获得字体和字体的大小,单这种情况下字体的是得到了,但字体的大小是负值,请问这个问题怎么解决?
具体代码如下:
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;
}

解决方案 »

  1.   

    负数就是正确的,msdn
    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. 
      

  2.   

    如果在字体对话框中我选中16号字体,那返回LogFont.lfHeight = -21,这个也是正确的吗,应该怎么才能得到16?
      

  3.   


    lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
      

  4.   

    PointSize的值应该怎么确定呢,是和DPI有关吗?应该怎么得到这个值呢?
      

  5.   


    //表明这个16号字体的绝对高度就是21
    //font.lfheight和字号之间的关系:      
    //int add = (((-font.lfHeight) % 4) > 1)? 1:0;   
    //字号 = -font.lfHeight - ((-font.lfHeight) / 4) - add;
      

  6.   

     lfHeight       
      这是以逻辑单位表示的希望的字符高度。您可以将lfHeight设定0,以使用内定大小,或者根据字段代表的含义将其设定为正数或负数。如果将lfHeight设定为正数,就表示您希望该值表示含有内部间隔(不是外部间隔)的高度。实际上,所要求的字体行距为lfHeight。如果将lfHeight设定为负值,则Windows会将其绝对值作为与点值一致的字体高度。这是一个很重要的区别:如果想要特定点值的字体,可将点值转换为逻辑单位,并将lfHeight字段设定为该值的负数。如果lfHeight是正值,则TEXTMETRIC结构的tmHeight字段近似为该值(有时有微小的偏差,可能由于舍入误差所引起)。如果lfHeight是负值,则它粗略地与不包括tmInternalLeading字段的TEXTMETRIC结构的tmHeight字段相匹配。   
      

  7.   

    库中有云:
    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};   
        
      

  8.   

    使用其它不是windows自带的字体试试
      

  9.   

         MulDiv函数的作用应该是将字号转化字体的大小(以逻辑单位来计算)。转化结果是取其绝对值的。