怎样获得字体坐标?

jjf120801 2008-10-27 03:52:55
例如,一个clistCtrl,我取得了他指定行指定列的坐标,我再如何取得这个列中的字符串的第三个字符的坐标?以便我从第4个字开始精确的画个矩形?

紧急中...
...全文
173 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjf120801 2008-10-28
  • 打赏
  • 举报
回复
搞定了!谢谢大家!
gamedragon 2008-10-28
  • 打赏
  • 举报
回复
SelectObject(hdc, this->GetFont());
GetTextExtentPoint32(*this->m_list.GetWindowDC(), "HHHH", 4, &s);

这两个是同一个DC么?
jjf120801 2008-10-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cnzdgs 的回复:]
我的意思是,假设要输出的字符串是HHHHffff,你分两次输出,先输出HHHH,再输出ffff,这样试试。
[/Quote]
不是的,先输出"HHHHHHHHHH",在第4个H上覆盖ffff。现在长度算出来不对,在第5个之后覆盖了。
cnzdgs 2008-10-27
  • 打赏
  • 举报
回复
我的意思是,假设要输出的字符串是HHHHffff,你分两次输出,先输出HHHH,再输出ffff,这样试试。
jjf120801 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhaohongbo83 的回复:]
CSize GetTextExtent( LPCTSTR lpszString, int nCount ) const;
这个取出指定的字符尺寸
[/Quote]

谢谢。但是这个我也试过了,得出宽度的值和GetCharWidth32是一样的,放到屏幕上还是不对。
我觉得是不是还需要获得系统中的字符象素宽度?
高手们,help!!!!还在加班中...
zhaohongbo83 2008-10-27
  • 打赏
  • 举报
回复
CSize GetTextExtent( LPCTSTR lpszString, int nCount ) const;
这个取出指定的字符尺寸
jjf120801 2008-10-27
  • 打赏
  • 举报
回复

GetTextExtentPoint32(*this->m_list.GetWindowDC(), "HHHH", 4, &s);

这个方法取到的4个"H"的宽度是44,但是实际不可能是44这么宽啊...
jjf120801 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cnzdgs 的回复:]
试试把字符串分成两段输出。
[/Quote]

请问什么意思?
jjf120801 2008-10-27
  • 打赏
  • 举报
回复
另外,GetCharWidth32为什么得不到值?


CString str = "tiger";
char *p=str.GetBuffer(str.GetLength());

LPINT as = 0;
GetCharWidth32(*this->m_list.GetWindowDC(), p[0], p[2], as);
cnzdgs 2008-10-27
  • 打赏
  • 举报
回复
试试把字符串分成两段输出。
jjf120801 2008-10-27
  • 打赏
  • 举报
回复
是不是GetTextExtentPoint32用long型计算坐标,不够精确导致的问题??
有没有用小数点计算的方法?
jjf120801 2008-10-27
  • 打赏
  • 举报
回复
不行,取不到精确

SIZE s;
CWindowDC dc(this);
HDC hdc = dc.GetSafeHdc();

SelectObject(hdc, this->GetFont());
GetTextExtentPoint32(*this->m_list.GetWindowDC(), "HHHH", 4, &s);
rc.left = rc.left + s.cx;


结果却是:在第5个H之后出现。
cnzdgs 2008-10-27
  • 打赏
  • 举报
回复
这类函数都可以。
获取DC用完后记得释放。
jjf120801 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 palmax 的回复:]
那你换GetCharWidth32试试

感觉在用 HDC 之前你没有把当前的字体 Select 进去,因为不同字体下同一字符串的像素长度应该不同

GetTextExtend是MFC库的函数,和vs是不是2005无关,你的工程不用MFC,就不要这个函数了。
[/Quote]

[Quote=引用 4 楼 gamedragon 的回复:]
要保证hDC里的字体和这个control的字体一致。
[/Quote]

谢谢,我是设进去了的。SelectObject(hdc, this->GetFont());
所以显示的字体是没问题的。我的工程是MFC的。
怎么用GetCharWidth32,我得研究下...
palmax 2008-10-27
  • 打赏
  • 举报
回复
那你换GetCharWidth32试试

感觉在用 HDC 之前你没有把当前的字体 Select 进去,因为不同字体下同一字符串的像素长度应该不同

GetTextExtend是MFC库的函数,和vs是不是2005无关,你的工程不用MFC,就不要这个函数了。
gamedragon 2008-10-27
  • 打赏
  • 举报
回复
要保证hDC里的字体和这个control的字体一致。
jjf120801 2008-10-27
  • 打赏
  • 举报
回复
简单的说就是:如何取得画面指定字符串的像素大小?
jjf120801 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 palmax 的回复:]
先GetItemRect获得对应列的矩形区域,然后再用GetTextExtend得到从字符串开始到第三个字符的长度,相加后取矩形的x坐标再加上1(防止重合)就是第四个字的位置
[/Quote]

我用的是vs2005,好像不是GetTextExtend,而是GetTextExtentPoint32。
我用GetTextExtend不能取得准确的长度,会有偏差...怎么办呢?

GetTextExtentPoint32(*this->m_list.GetWindowDC(), "HHHHH", 5, &a);
palmax 2008-10-27
  • 打赏
  • 举报
回复
先GetItemRect获得对应列的矩形区域,然后再用GetTextExtend得到从字符串开始到第三个字符的长度,相加后取矩形的x坐标再加上1(防止重合)就是第四个字的位置

19,464

社区成员

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

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