Chinaunix首页 | 论坛 | 博客
  • 博客访问: 237216
  • 博文数量: 27
  • 博客积分: 270
  • 博客等级: 二等列兵
  • 技术积分: 444
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-21 19:55
个人简介

Enjoy yourself!

文章分类

分类: C/C++

2015-08-12 16:43:31

  做菜单的时候遇到的一个问题,为了匹配菜单风格,需要一些特殊字体,但是客户的系统里面不一定会有这些字体,而我也不希望我们软件的字体会出现在客户的字体菜单中。因此找了个让字体加载进资源文件,从资源文件读取字体的办法。

点击(此处)折叠或打开

  1. void NMenu::InstallFont()
  2. {
  3.     m_resourceFont = NULL;
  4.     HINSTANCE hResInstance = GetModuleHandle(_T("MenuLibrary.dll"));//AfxGetResourceHandle( );
  5.     HRSRC res = FindResource(hResInstance,MAKEINTRESOURCE(IDR_FONT_MSYH),RT_FONT);//_T("Font"));
  6.     if(res)
  7.     {
  8.         HGLOBAL mem = LoadResource(hResInstance, res);
  9.         void *data = LockResource(mem);
  10.         DWORD len = SizeofResource(hResInstance, res);
  11.         DWORD nFonts = 0;
  12.         m_resourceFont = AddFontMemResourceEx(data,len,NULL,&nFonts);
  13.         if(!m_resourceFont)
  14.             AfxMessageBox(_T("字体加载失败!"));
  15.     }
  16.     else
  17.     {
  18.         AfxMessageBox(_T("字体加载失败!"));
  19.     }
  20. }

  需要注意的是hResInstance是指向包含资源的模块句柄。一开始开发的时候,自绘菜单类、调用菜单的对话框类和资源类在同一个项目中,所以可以用HINSTANCE hResInstance = AfxGetResourceHandle( );直接获取本程序的资源句柄,貌似用AfxGetApp()->m_hInstance也是一样的。

  后来自绘菜单类封装成dll(MenuLibrary.dll)后,从另一个项目调用菜单dll,那么hResInstance读到的就是对话框的句柄,因此需要指定自绘菜单类的dll的句柄HINSTANCE hResInstance = GetModuleHandle(_T("MenuLibrary.dll"));

  当然为了防止以后自己一不小心手贱改了dll的名字,又找到了另一个方法。作为模块句柄,其实在dllMain函数的第一个参数就是模块句柄了,通过一个全局变量去获取,同样可以得到当前模块的句柄哦!

  另外还需要注意HRSRC res = FindResource(hResInstance,MAKEINTRESOURCE(IDR_FONT_MSYH),RT_FONT);这句话,这个跟加载字体资源有一点点关系。顺便记录下加载字体过程。

  添加资源->自定义...->资源类型填写Font,资源类视图中出现Font。再次添加资源,此时资源类型里面并不会出现Font,直接选择导入,文件类型选“所有文件”,选择.ttf类型的字体文件。点击确定后,会弹框询问资源类型,再次填写Font,那么文字资源就会加到Font中了。程序中IDR_FONT_MSYH就是字体的资源ID,而RT_FONT是资源类型(有看到说字体资源是标准资源来着)。

  当然,自定义的时候,你可能填写的不是Font,而是TTF或者别的,也是可以的。那么再次添加资源的时候,资源类型就会出现新添加的“TTF”类型(“”是系统自己加上去的,应该是为了识别用户自定义吧),选择资源导入后,弹框询问资源类型时选择“TTF”,文字加载到“TTF”类型中。而此时RT_FONT需要改为_T("TTF")。




关于自定义资源获取的具体知识,可以参照 http://www.cnblogs.com/gakusei/articles/1352922.html

感谢阅读
End

阅读(3690) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~