有没有哪个字符串输出函数, 是可以输出文字的同时又返回文字宽度和高度的?

Sandrer 2012-12-06 08:48:12
在做一个项目, 窗口上有很多个子项, 每个子项里面的内容都是字符串(少则10来个长度20+以上的字符串, 多则上百个长度不等的字符串), 因为每个子项的高度都是不等的(因为要求每个子项的内容都必须完全显示), 所以在画的时候就要边计算高度边画(在窗口客户端范围外的就不画)

目前我的做法是用 CDC::GetTextExtent 来计算文字宽度和高度(因为窗口宽度是固定的, 所以换行的话也好计算)。然后用 CDC::DrawText 来输出文字

这个窗口中的内容需要拖动,而因为窗口必须要加背景图片(背景图片是固定不动的),所以不能把画好的东西预先保存为一个内存 DC 用来复制,需要边拖动边画。那么问题就来了,拖动的时候 CPU 的占用率高达一个核...客户机可没有我的开发机的配置高啊,所以有没有更好的方法来实现我所说的这些?
...全文
241 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-03-30
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
无言猪 2012-12-07
  • 打赏
  • 举报
回复
如果你有1000个项目就是每次移动都要计算1000次,可以另外建立一个链表来存每个项的RECT,以RECT的bottom的从大到小排序,移动窗口时从链表开始排查到可以显示的了,就把后面的都显示出来,这样平均的也是每次计算500次,另外的开销就是需要建表,并且每次移动项目的时候需要重新排序.
Sandrer 2012-12-07
  • 打赏
  • 举报
回复
引用 18 楼 lostying 的回复:
能不能建议一个表来存所有的项,按Y坐标的从低到高排序,计算窗口高度时截断到哪里,就只显示前面的,截断后的就不操作了.
客户端以外的内容我没有画的 每个项目都会保存一个 RECT 结构, 在画的时候会判断这个项目是否在客户端范围内的 如果一个点都不在客户端范围内的话才不去画的~~
无言猪 2012-12-07
  • 打赏
  • 举报
回复
能不能建议一个表来存所有的项,按Y坐标的从低到高排序,计算窗口高度时截断到哪里,就只显示前面的,截断后的就不操作了.
Sandrer 2012-12-07
  • 打赏
  • 举报
回复
引用 15 楼 xianglitian 的回复:
你绘制的字体字号是不是固定的 如果是可不可以考虑自己实现计算 也就是自己实现一个相对简单高效的方法代替GetTextExtent
所有项目的字体大小都是固定的。 但是就怕遇到一些特殊符号有可能导致计算不精确~
Sandrer 2012-12-07
  • 打赏
  • 举报
回复


这是之前写的一个窗口,客户机上面有可能会显示100多个子项目
如果不画图片的话,速度一流,但是把图片画上去的话,也是卡卡的
画图用的是 GDI+,现在暂时用的方法是用多线程分批画图
但如果拖动得比较快的话,部分图片可能会没显示,然后又要画下一次
还有一个问题就是,如果我把这个窗口封装成一个类,写成动态连接库的话
当程序脱离了 VS2005 后运行的话,会更卡!

这是我之前发的帖子
http://bbs.csdn.net/topics/390263442
向立天 2012-12-07
  • 打赏
  • 举报
回复
你绘制的字体字号是不是固定的 如果是可不可以考虑自己实现计算 也就是自己实现一个相对简单高效的方法代替GetTextExtent
Sandrer 2012-12-07
  • 打赏
  • 举报
回复

这是效果图,如果取消背景的话处理起来就简单很多了
画面上如果显示1、2项的话对速度没什么影响
但因为客户机的分辨率比较大,一次显示的项目可能会超过2项
所以拖动起来就会卡卡的
Sandrer 2012-12-07
  • 打赏
  • 举报
回复
引用 11 楼 tiger9991 的回复:
这个,楼主 你应该用CRectTracker,拖动的时候只绘制个框。 否则机器承受不了的,最早版本的SP1的XP就有这个问题,后来在SP3之后修正了这个问题。 我以前实现Visio的拖拽效果就是这么做的。
因为需要画的东西是在一个窗口的客户区里的,拖动的时候不是拖动这个窗口 而是拖动窗口里面画出来的内容,而这些画出来的内容是占满整个窗口的 所以我觉得显示一个框的话就没什么作用了
baoyz 2012-12-06
  • 打赏
  • 举报
回复
双缓冲的意义不在于先画再贴防闪。 更多的意义在于,多缓冲,将“很多个子项”分别用完整的内存DC画出来,画N多个,然后往一张背景上贴。for() {BitBlt();} 这样就不用不停的画画了。
傻X 2012-12-06
  • 打赏
  • 举报
回复
这个,楼主 你应该用CRectTracker,拖动的时候只绘制个框。 否则机器承受不了的,最早版本的SP1的XP就有这个问题,后来在SP3之后修正了这个问题。 我以前实现Visio的拖拽效果就是这么做的。
lgstudyvc 2012-12-06
  • 打赏
  • 举报
回复
引用 8 楼 Sandrer 的回复:
引用 6 楼 lgstudyvc 的回复: 拖动时双缓存 现在不是闪烁的问题, 而是拖动时候的延时问题了! 我第一次的东西都没画完就要画第二次了,能快吗? 会画图的人都知道用内存画图滴~
抱歉滴很
Sandrer 2012-12-06
  • 打赏
  • 举报
回复
暂时的解决方案是每移动10个像素或者每触发3次WM_MOUSEMOVE消息才进行绘图 拖动得快的话还不明显,如果拖动得比较慢的话就感觉卡卡的
Sandrer 2012-12-06
  • 打赏
  • 举报
回复
引用 6 楼 lgstudyvc 的回复:
拖动时双缓存
现在不是闪烁的问题, 而是拖动时候的延时问题了! 我第一次的东西都没画完就要画第二次了,能快吗? 会画图的人都知道用内存画图滴~
Sandrer 2012-12-06
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
DrawText(...,DT_CALCRECT); DrawText(....);
试过了, 效率还不如 GetTextExtent 今天早上才做的测试, 5000次循环 DrawText(..., DT_CALCRECT) 用了1.8秒多 5000次循环 GetTextExtent() 才用了100毫秒不到
lgstudyvc 2012-12-06
  • 打赏
  • 举报
回复
拖动时双缓存
Eleven 2012-12-06
  • 打赏
  • 举报
回复
DrawText(...,DT_CALCRECT); DrawText(....);
Sandrer 2012-12-06
  • 打赏
  • 举报
回复
有没有谁知道 IE 的窗口是怎么做的? 满屏的字符串随便拖也才占半个核...
Sandrer 2012-12-06
  • 打赏
  • 举报
回复
我的开发机屏幕分辨率是1440*900, 显示的东西还不算多 但是拿到客户机上面去测试,拖动的时候卡得要命啊... 客户机的分辨率是2415*2155的....配置只有2G内存和一个双核2.4G的CPU
Sandrer 2012-12-06
  • 打赏
  • 举报
回复
要实时拖动... 客户端是一个触摸屏一体机~
加载更多回复(1)

15,979

社区成员

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

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