VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 481|回复: 2

《VC++各种控件使用》第6课Group Combo Box源代码编译问题

[复制链接]
61_avatar_middle
最佳答案
0 
在线会员 发表于 2019-3-8 17:59:22 | 显示全部楼层 |阅读模式
3驿站币
《VC++各种控件使用》第6课,Group Combo Box这个界面,看起来还是非常强大的,源代码用VS2013编译成功,但运行出错,老大看看,怎么设置一下编译器,出个教程讲讲里面的源代码就更好了
《VC++各种控件使用》第6课Group Combo Box源代码编译问题

报错截图

报错截图
《VC++各种控件使用》第6课Group Combo Box源代码编译问题
《VC++各种控件使用》第6课Group Combo Box源代码编译问题 GroupComboBoxDemo.zip (412.74 KB, 下载次数: 2)





上一篇:MessageBoxA(NULL, 111, "标题", 0); 刚学第一天怎么用啊
下一篇:MFC的CString类型有问题
51_avatar_middle
最佳答案
82 
online_admins 发表于 2019-3-8 22:27:36 | 显示全部楼层
这个问题的原因就是枚举到的字体名字太长了,默认的 LOGFONT 结构体中的 lfFaceName 装不下了,lfFaceName 的长度默认是 LF_FACESIZE 也就是32个字符,而枚举到了一个:fontname = L"Bahnschrift SemiLight SemiCondensed" 叫这个名字的字体,所以导致赋值的时候崩溃了,暂时解决的办法就是如果字体名字的长度超过 LF_FACESIZE 就给他截断,具体代码加在:EnumFontFamiliesExProc 函数中:加个判断:
  1. if (fontname.GetLength() >= LF_FACESIZE)
  2. {
  3.         fontname = fontname.Left(fontname.GetLength() - 4);
  4. }
复制代码


完整代码如下:
  1. int CALLBACK EnumFontFamiliesExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, int FontType, LPARAM lParam)
  2. {
  3.         std::map<CString, std::set<CString>>* fonts = reinterpret_cast<std::map<CString, std::set<CString>>*>(lParam);
  4.         CString fontGroup;
  5.         switch (FontType)
  6.         {
  7.         case RASTER_FONTTYPE:
  8.                 fontGroup = FONTS_GROUP_RASTER;
  9.                 break;
  10.         case DEVICE_FONTTYPE:
  11.                 fontGroup = FONTS_GROUP_DEVICE;
  12.                 break;
  13.         case TRUETYPE_FONTTYPE:
  14.                 if ((lpntme->ntmTm.ntmFlags & NTM_TT_OPENTYPE) == NTM_TT_OPENTYPE)
  15.                         fontGroup = FONTS_GROUP_OPENTYPE;
  16.                 else
  17.                         fontGroup = FONTS_GROUP_TRUETYPE;
  18.                 break;
  19.         default:
  20.                 TRACE(_T("Unknown font type: %s\n"), lpelfe->elfFullName);
  21.                 return 1;
  22.         }
  23.         int nameOffset = (lpelfe->elfFullName[0] == _T('@')) ? 1 : 0;
  24.         CString fontname(lpelfe->elfFullName + nameOffset);
  25.         if (fontname.GetLength() >= LF_FACESIZE)
  26.         {
  27.                 fontname = fontname.Left(fontname.GetLength() - 4);
  28.         }

  29.         (*fonts)[fontGroup].insert(fontname);
  30.         return 1;
  31. }
复制代码
61_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-3-8 23:42:26 | 显示全部楼层
Syc 发表于 2019-3-8 22:27
这个问题的原因就是枚举到的字体名字太长了,默认的 LOGFONT 结构体中的 lfFaceName 装不下了,lfFaceName  ...

《VC++各种控件使用》第6课Group Combo Box源代码编译问题 《VC++各种控件使用》第6课Group Combo Box源代码编译问题

这样做,下拉框的 《自动宽度》 功能, 好像失效了?
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-19 18:23

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表