高分求助:如何获得变宽字体的确切宽度?

mbctb 2010-04-16 06:26:27
大家知道,现在的系统字体已经是变宽字体了,尤其是用CreateFontIndirect建立的逻辑字体,很多都是TureType字体,更是变宽字体。

可是用GetTextMetrics只能获得当前字体的平均宽度,这样在编程中就会造成很大的麻烦:比如我想做一个字处理软件,输入一段句子:

Texitksjdklsldfowewwwwwwwiiiiii

现在要把鼠标的光标定位在某个字符前面,当点击鼠标的时候,程序要根据鼠标点击时的位置,找到对点的字符,然后把插入指示插在那个地方。这样就需要每个字体的确切宽度。只有“平均宽度”是不行的。(w比i要宽得多,如果前面都是w,或都是i,用平均宽度就会出现很大的误差)。

请问,用哪一个函数可以找到当前字体中某个字符的确切宽度?

请高手指点,万分感谢!
...全文
257 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
guanqingyan 2011-04-15
  • 打赏
  • 举报
回复
想看2楼答案,呵呵
wade_2003 2010-04-16
  • 打赏
  • 举报
回复
记得好像孙鑫老师讲的就是GetTextExtent(),呵呵
mbctb 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cattycat 的回复:]
用CreateFontIndirect创建字体后,然后SelectObject把字体选人DC,再调用GetTextMetrics获取字符的信息。你看看TEXTMETRIC结构的各字段的含义。
这个链接是有关字体的API和结构,你看看有用不。
http://bbs.51cto.com/thread-584018-1.html
[/Quote]
用GetTextMetrics函数不行的,它只能给出当前字体的平均宽度和最大宽度。但是不能精确给出每个字符的宽度。而在变宽字体中,每个字符的宽度是不一样的。i就比w宽度要小得多。

你提供的网址那么多函数很全面,我有时间好好学习一下。谢谢!
mbctb 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thefirstz 的回复:]
这个函数能不能满足楼主要求?

C/C++ code
CDC::GetTextExtent
CSize GetTextExtent( LPCTSTR lpszString, int nCount ) const;

CSize GetTextExtent( const CString& str ) const;

Return Value

The dimensions……
[/Quote]
谢谢!我已经找到了,是GetCharWidth,从介绍上看应该就是我要找的函数。你介绍的这个函数能求出一个了字符串的宽度,也很好,这样我的程序就简单多了。

以前你知道我是怎么办的?麻烦死了!我先建立一个内存设备内容,然后再建立一个位图,然后把位图选进内存设备内容。然后,当我需要某个字体宽度的时候,先把内存设备内容的当前点移到(0,0),然后再向这个内存设备内容写入该字符。然后再取出当前位置,根据两次当前位置的变化,算出字符的宽度。

这样做简直烦死人了,以前逻辑简单的时候还行,现在编的东西逻辑复杂了,再用这种方法,非出人命不可。只好来求教。

再次感谢!
cattycat 2010-04-16
  • 打赏
  • 举报
回复
用CreateFontIndirect创建字体后,然后SelectObject把字体选人DC,再调用GetTextMetrics获取字符的信息。你看看TEXTMETRIC结构的各字段的含义。
这个链接是有关字体的API和结构,你看看有用不。
http://bbs.51cto.com/thread-584018-1.html
昵称很不好取 2010-04-16
  • 打赏
  • 举报
回复
这个函数能不能满足楼主要求?
CDC::GetTextExtent
CSize GetTextExtent( LPCTSTR lpszString, int nCount ) const;

CSize GetTextExtent( const CString& str ) const;

Return Value

The dimensions of the string (in logical units) in a CSize object.

Parameters

lpszString

Points to a string of characters. You can also pass a CString object for this parameter.

nCount

Specifies the number of characters in the string.

str

A CString object that contains the specified characters.

Remarks

Call this member function to compute the width and height of a line of text using the current font to determine the dimensions. The information is retrieved from m_hAttribDC, the attribute device context.

The current clipping region does not affect the width and height returned by GetTextExtent.

Since some devices do not place characters in regular cell arrays (that is, they carry out kerning), the sum of the extents of the characters in a string may not be equal to the extent of the string.

mbctb 2010-04-16
  • 打赏
  • 举报
回复
我翻遍了Charles Petzold的《Windows程序设计》,也没有找到这方面的内容,只有GetTextMetrics取得当前字体的平均宽度的方法。

如何找到每个字符的确切宽度?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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