CreateFontIndirect函数功能

  • 创建一个逻辑字体,创建的字体具有LOGFONT对象确定的特性。创建的字体后边就可以由任何设备环境选择作为当前的字体。
HFONT CreateFontIndirect(
CONST LOGFONT *lplf   //pointer to logical font structure
);

lplf是一个定义逻辑字体特性的LOGFONT结构指针。LOGFONT结构体定义了字体的特性:

typedef struct tagLOGFONT {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; //字体间距和字体集TCHAR lfFaceName[LF_FACESIZE]; //字体名称
} LOGFONT, *PLOGFONT;

这里是MSDN上对该结构体的介绍,大家可参考,我不做赘述。

  • 返回值
    如果函数创建成功,返回逻辑字体的句柄,否则返回NULL值。
    当用SelectObject函数选择创建的字体后,GDI的字体映射机制就会将其与已经存在的物理字体进行匹配,如果找不到完全一样的字体,GDI会提供一种选择字体,这种字体大多数特性与要求的特性相符。当不需要这种字体的时候,应该条用DeleteObject函数删除。
    MSDN上的原文是这么写的:


The CreateFontIndirect function creates a logical font with thecharacteristics specified in the LOGFONT structure. When this font is selected by using the Select Object function, GDI’s font mapper attempts to match the logical font with an existing physical font. If it fails to find an exact match, it provides an alternative whose characteristics match as many of the requested characteristics as possible.

  • 用CreateFontIndirect方法创建字体
hdc = BeginPaint(hwnd,&ps);  //前面声明了LOGFONT lonfont;
GetObject(GetStockObject(SYSTEM_FONT),sizeof(LOGFONT),&logfont);
logfont.lfItalic = true;
logfont.lfItalic=true;//使用斜体
logfont.lfHeight=16;//字体高度为16PX
logfont.lfWeight=20;//字体宽度为20PX
logfont.lfCharSet=GB2312_CHARSET;//国标2312
wsprintf(logfont.lfFaceName,TEXT("%s"),TEXT("宋体"));
hfont=CreateFontIndirect(&logfont);//字体为宋体
SelectObject(hdc,hfont);......//,使用SelectObject添加到HDC环境中,后面就是你要输出的东西

警示

  • 使用CreateFontIndirect方法创建字体时,一定要注意一点,那就是大多数的东亚的语言有两个字体名称,一个是英语名称一个是本地名称。CreateFont和CreateFontIndirect在本地系统环境上仅识别字体的本地名称,同时识别非本地的字体的应为名称。也就是说,如果用CreateFont和CreateFontIndirect创建一个应为名称的字体不能创建时,那么请尝试一下该字体的本地名称或者将本地系统的环境修改为非东亚地区。利用EnumFonts,EnumFontFamilies和EnumFamiliesEx就可以查找字体的英文名称。
    这是关于EnumFamiliesEx的使用方法MSDN上的说明,供大家参考。

  • Creating a Logical Font

也可以Creating a Logical Font弹出对话框,从而自己选择创建你想要的字体,具体代码如下:

HFONT FAR PASCAL MyCreateFont( void )
{ CHOOSEFONT cf; LOGFONT lf; HFONT hfont; // Initialize members of the CHOOSEFONT structure.  cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = (HWND)NULL; cf.hDC = (HDC)NULL; cf.lpLogFont = &lf; cf.iPointSize = 0; cf.Flags = CF_SCREENFONTS; cf.rgbColors = RGB(0,0,0); cf.lCustData = 0L; cf.lpfnHook = (LPCFHOOKPROC)NULL; cf.lpTemplateName = (LPSTR)NULL; cf.hInstance = (HINSTANCE) NULL; cf.lpszStyle = (LPSTR)NULL; cf.nFontType = SCREEN_FONTTYPE; cf.nSizeMin = 0; cf.nSizeMax = 0; // Display the CHOOSEFONT common-dialog box.  ChooseFont(&cf); // Create a logical font based on the user's  // selection and return a handle identifying  // that font.  hfont = CreateFontIndirect(cf.lpLogFont); return (hfont);
} 

会产生一个dialogbox显示可用的字体,当你选中某字体并ok时,chooseFont会用你选择的字体的数据初始化LOGFONT结构体从而用createFontIndirect创建本地字体。

  • 最后出一种最方面最简单的方法解决上述字体本地化问题。
    从根本上来讲,无论东亚还是什么地区字体的差异从根本上来讲都是字符集的不同导致的字体名称略有不同,然而微软会根据系统设置中的location从而设定缺省的字符集,例如,如果系统设置为United States ,则CreateFontIndirect缺省的字符集就是ANSI_CHARSET.
    If an application uses a font with an unknown character set, it should not attempt to translate or interpret strings that are rendered with that font.
    This parameter is important in the font mapping process. To ensure consistent results, specify a specific character set. If you specify a typeface name in the lfFaceName member, make sure that the lfCharSet value matches the character set of the typeface specified in lfFaceName.
    这是MSDN上的原话,所以用到什么字体一定要设置这个字体对应的字符集,这样上边的情况就迎刃而解了。
    我就在这上边吃了一个很大的苦头,引以为戒。特此记录,以备忘。

CreateFontIndirect函数简介相关推荐

  1. SQL中 decode()函数简介

    今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: 主要作用:将查询结果翻译成其他值(即 ...

  2. 【Android 逆向】ptrace 函数 ( C 标准库 ptrace 函数简介 | ptrace 函数真实作用 )

    文章目录 一.C 标准库 ptrace 函数简介 二.ptrace 函数真实作用 一.C 标准库 ptrace 函数简介 ptrace 函数 : 在 C 标准库 中有一个 ptrace 函数 , 该函 ...

  3. TypeScript基础入门 - 函数 - 简介

    2019独角兽企业重金招聘Python工程师标准>>> 转载 TypeScript基础入门 - 函数 - 简介 项目实践仓库 https://github.com/durban89/ ...

  4. Python之pandas:pandas的get_dummies函数简介(将分类变量转为哑变量)及其使用方法之详细攻略

    Python之pandas:pandas的get_dummies函数简介(将分类变量转为哑变量)及其使用方法之详细攻略 目录 pandas的get_dummies函数简介 pandas.get_dum ...

  5. Python之sklearn:LabelEncoder函数简介(编码与编码还原)、使用方法、具体案例之详细攻略

    Python之sklearn:LabelEncoder函数简介(编码与编码还原).使用方法.具体案例之详细攻略 目录 LabelEncoder函数的简介(编码与编码还原) Methods LabelE ...

  6. Python:numpy库中的一些函数简介、使用方法之详细攻略

    Python:numpy库中的一些函数简介.使用方法之详细攻略 目录 numpy库中的一些函数简介.使用方法 1.np.concatenate() 1.1.函数案例 1.2.函数用法 numpy库中的 ...

  7. php-calendar,PHPCalendar的函数简介

    PHPCalendar的函数简介 PHPCalendar函数 日历扩展包含了简化不同日历格式间的转换的函数.下面是小编为大家整理的PHPCalendar的'函数简介,欢迎参考~ PHP Calenda ...

  8. C++ inline 函数简介

    1.inline 函数简介 inline 函数由 inline 关键字定义,引入 inline 函数的主要原因是用它替代 C 中复杂易错不易维护的宏函数. 2.编译器对 inline 函数的处理办法 ...

  9. oracle sql文字列函数,Oracle 数据库SQL中 decode()函数简介

    decode()函数简介: 主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明): 使用方法: Select decode(columnname,值1,翻译值1,值2,翻译值2,.. ...

最新文章

  1. 网络:为什么会出现大量的time_wait状态
  2. 工程师男友如何反窃听?趣聊密码学入门科普
  3. Gym - 102460A Rush Hour Puzzle(dfs迭代加深)
  4. 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)
  5. stlink 升级固件以后失败_STM32固件升级的一点经验
  6. spring学习(13):使用junit4进行单元测试续
  7. CQRS之旅——旅程6(我们系统的版本管理)
  8. JPA + EclipseLink + SAP云平台 = 运行在云端的数据库应用 1
  9. 您的618快递正在燃烧?12吨快递货车高速上起火,网友:代入感极强!
  10. java 不同类之间传递数据_java 数据在不同类之间的传递
  11. Java基础学习总结(50)——Java事务处理总结
  12. Android中自定义水球
  13. oem718d 基准站设置_华测口袋RTK正式发布!-华测导航
  14. 南半球左撇子的人是否多一些
  15. 使用 SpiritManager 类管理在 XNA 游戏中的精灵(十四)
  16. Springboot的工作机制:5 总结
  17. SAT数学:必背公式之三角函数
  18. 技术工坊|腾讯华为入局的区块链BaaS平台解决了什么问题?(上海)
  19. MySQL删除注册表的卸载方式
  20. Python实验四:Python程序设计之文件

热门文章

  1. 字符串匹配:BF算法
  2. 5.《程序猿扯淡系列》吃货的理想--健康从吃开始
  3. float类型表示方式及范围深度解析
  4. python年龄判断,输入年龄,判断是否成年
  5. 关于使用一个5升容器和一个6升容器量出3升水的一点解决办法
  6. 图片路径中含有中文在jsp下不能正常显示的问题
  7. 北大占3成、00后超一半,2022阿里全球数学竞赛77位获奖者出炉
  8. android修改系统density,Android应用开发Android 修改系统默认density
  9. Golang 通过jsonTag设置Struct或者Struct数组中的字段
  10. 循环数组的方法及区别