请问下面程序中,有了创建字体为什么还要系统字体HFONT CCaiWinMsg::GetFont(void)
#006 {
#007  LOGFONT lf; //字符的结构 
#008 
#009  //获取当前系统的字体.
#010  GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT),
#011         &lf);
#012 
#013  //设置字体的属性.
#014  lf.lfWeight = FW_BOLD;
#015  lf.lfItalic = true;          
#016  lf.lfHeight = 26;
#017 
#018  //设置为宋体.
#019  wsprintf(lf.lfFaceName,_T("%s"),_T("宋体"));
#020 
#021  //创建字体并返回
#022  return CreateFont(lf.lfHeight, lf.lfWidth,
#023         lf.lfEscapement, lf.lfOrientation, lf.lfWeight,
#024         lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet,
#025         lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality,
#026         lf.lfPitchAndFamily, lf.lfFaceName);
#027 
#028 }

解决方案 »

  1.   

    CreateFont(...) 不是自定义一个特殊字体吧(如规划某个字符怎么个样子),而是根据设置从系统字体里挑选个最适合匹配的字体形成一个逻辑字体设定供程序使用。
      

  2.   

    请问大佬意思能不能这样理解,选择某一个系统的字体,那么,这个系统名字体就有各种属性,而有些属性不是我们想要的,所以我们要修改一下属性,那么CreateFont就是为这个做准备的,是吗?就像那个什么鬼linux内核裁剪一样的道理,可以这么理解吗???
      

  3.   

    还有个问题想请教一下大佬,win32上面说系统字体有OEM_FIXED_FONT、ANSI_FIXED_FONT、ANSI_VAR_FONT、SYSTEM_FONT
    DEVICE_DEFAULT_FONT、SYSTEM_FIXED_FONT、DEFAULT_GUI_FONT这几种。
    请问这几种字体与下面的字符集有什么关系,我说的关系意思是一种字体是不是可以对应多种字符集???
    #define ANSI_CHARSET  0      // 1252 Latin 1 (ANSI)
     
    #define DEFAULT_CHARSET 1
      
    #define SYMBOL_CHARSET 2
      
    #define MAC_CHARSET 77
      
    #define SHIFTJIS_CHARSET  128 // 932 (DBCS, 日本)
     
    #define HANGEUL_CHARSET 129 // 949 (DBCS, 韩文)
     
    #define HANGUL_CHARSET 129 // " "
     
    #define JOHAB_CHARSET 130 // 1361 (DBCS, 韩文)
     
    #define GB2312_CHARSET 134 // 936 (DBCS, 简体中文)
     
    #define CHINESEBIG5_CHARSET 136 // 950 (DBCS, 繁体中文)
     
    #define GREEK_CHARSET 161 // 1253希腊文
     
    #define TURKISH_CHARSET 162 // 1254 Latin 5 (土耳其文)
     
    #define VIETNAMESE_CHARSET 163 // 1258越南文
     
    #define HEBREW_CHARSET 177 // 1255希伯来文
     
    #define ARABIC_CHARSET 178 // 1256阿拉伯文
     
    #define BALTIC_CHARSET 186 // 1257波罗的海字集
     
    #define RUSSIAN_CHARSET 204 // 1251俄文 (斯拉夫语系)
     
    #define THAI_CHARSET 222 // 874泰文
     
    #define EASTEUROPE_CHARSET 238 // 1250 Latin 2 (中欧语系)
     
    #define OEM_CHARSET 255 // 地区自订
      

  4.   

    #2,不是修改属性吧,而是那你的要求去套,哪个最匹配就是哪个;文字高度应该是例外,矢量字体可以适配任何的高度,点阵字体就是字体文件里定义的固定的几个高度了。
    #3,一个字体是可以有多个字符集的,用系统的字符映射表程序charmap.exe 就可以看出来,选择了如宋体,打开“高级查看”选项,下面的“字符集”列表里往往就会有多个项;应该是为了兼容起见,尽可能多的定义了常见的比较可能使用到的字符集如汉字、日文等等,尤其些西方字符集,往往量比较少,多就数十个,定义了也不占多大地方,就加进去了。
      

  5.   

    不知道大佬是否还在,能否再请教2个问题:
    1:画刷是不是只有在WM_PAINT消息下才能设置画刷,能否在WM_CREATE消息下设置画刷,比如:
    case   WM_CREATE:
    hdc = BeginPaint(hwnd, &ps);
    SelectObject(hdc, GetStockObject(GRAY_BRUSH));
    EndPaint(hwnd, &ps);
    2:关于InvalidateRect的问题:
         它的第三个参数是擦除,擦除的到底是什么???若是第三个参数为TRUE的话,比如有一个矩形背景色是白色,在其中画了一条线,擦除的时候,这条线会被擦除吗?????还是说只是背景色被擦除而已,上面的文字或者线条任然存在。
      

  6.   

    这不是些 c for windows方面的问题吗,应该发到 c 开发语言版吧。
    1. 在需要进行绘制使用到画刷时都可以设置吧,不限定 WM_PAINT 消息里的。
    2. 想来是擦除了的吧,那里有条线,除了你自己知道进行维护外,别人是不知道的,只在需要时用背景色/图案填充下。
    这些问题,自己把代码按设想的不同场景各自运行下,就能看到结果的吧。