求GDI+中获得字符串准确长度的方法

screen12 2014-02-19 09:05:33
我先是用MeasureString来获取字符串的长度,但总比实际的大,后来查到了MSDN上这样一段话:

备注
MeasureString 方法旨在与个别字符串一起使用,它在字符串前后包括少量额外的空格供突出的标志符号使用。 另外,DrawString 方法会调整标志符号镑值以优化显示质量,它显示的字符串可能比 MeasureString 报告的窄。 若要获得适合布局中相邻字符串的度量值(例如,实现格式化文本时),请使用 MeasureCharacterRanges 方法或者使用带有 StringFormat 的 MeasureString 方法中的一种,然后传递 GenericTypographic。 同样,请确保 Graphics 的 TextRenderingHint 是 AntiAlias。

于是我按照它说的"使用带有 StringFormat 的 MeasureString 方法中的一种,然后传递 GenericTypographic。 同样,请确保 Graphics 的 TextRenderingHint 是 AntiAlias"这样方法,代码如下:

Graphics graph(hdc);
graph.SetTextRenderingHint(TextRenderingHintAntiAlias);
StringFormat stringFormat;
stringFormat.SetAlignment(StringAlignmentNear);
stringFormat.GenericTypographic();
rcfComp.X = x;
rcfComp.Y = y;
converted = MultiByteToWideChar(CP_ACP, 0, input, inputnum, wstr, 256);
graph.MeasureString(wstr, converted, pCompFont, rcfComp, &rcfComp);

可是获取的rcComp的宽度,仍然和原来一样,比实际字符串要宽.

我是个新手,不知道上面代码是否正确,麻烦帮我看一下,谢谢!
...全文
542 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
screen12 2014-02-20
  • 打赏
  • 举报
回复
我感觉GDI+处理文字和GDI不一样.

比如,用"微软雅黑"字体,字体大小为16像素,我用GDI的GetTextExtentExPoint32测出"mmmm"的宽度为36,而每个汉字宽度为16,这样的话,"mmmm"宽度应该比两个汉字稍宽,远远不到三个汉字的宽度.

可是用GDI+显示的结果是:



从图中可以看出,"mmmm"的宽度超过三个汉字的宽度.

所以,感觉GDI+和GDI处理文字不一样,同样的"微软雅黑",同样的16个像素大小的字体.显示效果却不一样.
screen12 2014-02-20
  • 打赏
  • 举报
回复
引用 1 楼 xiaohuh421 的回复:
TextOut, 或者 GetTextExtentExPoint, GetTextExtentExPoint32试试, 我记得这两个函数都比较准确的.
这些函数好象是GDI的内容,也可以用于GDI+吗?
邓学彬 2014-02-20
  • 打赏
  • 举报
回复
引用 5 楼 screen12 的回复:
好的,我试试,不知可否加你的QQ?
QQ仅用来业务联系,不聊天. 如果有事找我,可发Email:Bin@it608.com 或者加入QQ群一起交流:软件UI技术研究 群号2423632 另:我只弄过输入法的界面,关于功能方面的问题我帮不上忙.
xiaohuh421 2014-02-20
  • 打赏
  • 举报
回复
TextOut, 或者 GetTextExtentExPoint, GetTextExtentExPoint32试试, 我记得这两个函数都比较准确的.
screen12 2014-02-20
  • 打赏
  • 举报
回复
我还有一个输入法上的难题,一直困扰我,只需要有人点拨一点即可.(我的输入法已经快要制作完成,只剩下一点小问题).
screen12 2014-02-20
  • 打赏
  • 举报
回复
引用 4 楼 CometNet 的回复:
MeasureString和DrawString都带上StringFormat就准确了. 我之前做输入法窗口也是这样干的.
好的,我试试,不知可否加你的QQ?
邓学彬 2014-02-20
  • 打赏
  • 举报
回复
MeasureString和DrawString都带上StringFormat就准确了. 我之前做输入法窗口也是这样干的.

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧