作者:朱金灿
来源:http://blog.csdn.net/clever101
应该说这不是一个高深的问题,不过研究下来还是有一点收获。首先说说为什么要获取字符串的精确绘制范围,这个主要是为了提高绘图效率,比如我们绘图时只是修改某个区域的字符串,在这种情况下更新整个客户区肯定是不合理,因此获取精确的范围进行更新是一种通行的做法。
经过搜索,我发现GDI中获取字符串精确绘制范围的做法有两种,一是使用CDC类的GetTextExtent函数;另一种方法是petzod的《Windows程序设计》中的第四章输出文字介绍的方法,简单来说就是获取每个字符的宽高,然后进行计算。为此我写了两个函数:
/*! * @brief 使用CDC类GetTextExtent接口获取字符串的精确的区域大小 * * @param nXStart [in]区域的起点X坐标 * @param nYStart [in]区域的起点Y坐标 * @param pDC [in]设备DC指针 * @param str [in]字符串 * @return 该字符串的精确区域 */ CRect CFontSizeView::GetCharExtent(int nXStart,int nYStart,CDC *pDC,const CString &str) { CSize fontSize = pDC->GetTextExtent(str); return CRect(nXStart,nYStart,nXStart+fontSize.cx,nYStart+ fontSize.cy); } /*! * @brief 使用petzod的《Windows程序设计》中的第四章输出文字介绍的方法, * 简单来说就是获取每个字符的宽高,然后进行计算。具体大家可以看该书的第四章。 * * @param nXStart [in]区域的起点X坐标 * @param nYStart [in]区域的起点Y坐标 * @param pDC [in]设备DC指针 * @param str [in]字符串 * @return 该字符串的精确区域 */ CRect CFontSizeView::GetCharExtent2(int nXStart,int nYStart,CDC *pDC,const CString &str) { TEXTMETRIC tm; pDC->GetTextMetrics(&tm); LONG cxChar = tm.tmAveCharWidth ; LONG cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ; // 单个字符的宽度 LONG cyChar = tm.tmHeight + tm.tmExternalLeading ; // 单个字符的高度 return CRect(nXStart,nYStart,nXStart+str.GetLength()*cxCa ps,nYStart+cyChar); } 一般来说大家可能倾向于使用第一种方法,即使用CDC类GetTextExtent接口获取字符串的精确的区域大小。但是我经过多次测试发现,如果绘制的字符串为全英文是,第二种方法的效果更好。在全英文的情况下,在常规字形下通过两种方法获取区域进行绘制效果没有差别,但是在斜体字形下,使用CDC类GetTextExtent接口是下面的效果:
而使用GetCharExtent2是下面的效果:
显然使用GetCharExtent2函数的效果更好。
接着进行更多的测试,发现如果字符串是全中文的话一定要用CDC类GetTextExtent接口,petzold的方法看来是不适用中文,另外如果字符串是中英文结合的话,也必须用CDC类GetTextExtent接口。
发表评论
-
使用正则表达式处理邮件模板中的参数
2012-07-06 09:45 658软件开发过程中,经常使用JavaMail给用户发送邮件;大 ... -
正则表达式 cscope emacs svn putty emacs
2012-07-06 09:38 771我一懒人,图自己方便。要是路过的朋友们用上了的话,请给懒人 ... -
C# winform 启动画面支持多种 framework
2012-07-06 09:30 902using System; using System.Co ... -
18位身份证验证代码
2012-07-05 20:45 803首先php版本的: /** * 身份证 * * @para ... -
在Flex组件上显示手型的鼠标
2012-07-03 13:44 669在Flex组件上显示手型的鼠标 有些时候,我们需要 ... -
Flex学习笔记
2012-07-02 12:46 562类成员有四种修饰 ... -
关于Firefox重新加载flex的问题解决
2012-07-02 12:46 834DIV中有一个flex,我希望用js来控制它的显示和隐藏, ... -
flex取数据1
2012-07-02 12:45 533HTML通过JavaScript传递信息到Flex中 ... -
Pivot升级为Apache顶级项目,准备好挑战Flex, Silverlight和JavaFX
2012-07-02 12:45 615Apache软件基金会(ASF)于昨天宣布,将Pivot ... -
Flex控制对主机网页中脚本的访问
2012-07-02 12:45 517通过使用以下 ActionScript 3.0 API 可 ... -
视频聊天网站的研究、发展以及趋势(转)
2012-07-01 10:07 518此文讲述了视频聊 ... -
Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo )
2012-07-01 10:07 1018本文根据下文整理而成: http://mantocom.b ... -
转载:WebKit介绍及总结(三)
2012-07-01 10:07 675六 . 编译与调试 在 ubuntu-10.04 上 ... -
ExtJS 4 Grid组件
2012-07-01 10:07 614我们正 ... -
[转载]flex开源框架汇总-leo_wlcnblogs-博客园
2012-06-30 16:34 689[转载]flex开源框架汇总-leo_wlcnblogs-博客 ... -
【FLEX学习】第五天
2012-06-30 16:34 574【FLEX学习】第五天 2011年02月17日 1.细化 ... -
使用Flex和Actionscript开发Flash游戏―(八)
2012-06-30 16:34 499使用Flex和Actionscript开发Flash游戏―(八 ... -
使用Flex3.0 AIR 创建“不规则形状”的Air透明窗体
2012-06-30 16:34 562使用Flex3.0 AIR 创建“不规则形状”的Air透明窗体 ... -
ria big bang = {flash/air/flex .vs. html5}_chriswang
2012-06-30 16:34 607ria big bang = {flash/air/flex ...
相关推荐
C# WPF GDI字符串绘制成图片,根据输入大小,分割字符串数据,自动换行,根据字体样式,大小,绘制成字符串图片。
使用GDI32中API计算字符串的精确象素长度
/// 绘制文字自动换行 /// /// 绘图图面 /// 绘制文本 /// 绘制字体 /// 字体颜色 /// 最大宽度,达到最大宽度则换行 /// 起始坐标 /// 段落高度间隔 /// 字体间隔</param>
易语言GDI绘制进度条源码,GDI绘制进度条,进度条,InvalidateRect,ValidateRect,BeginPaint,SaveDC,RestoreDC
因为代码中很少注释,我在这里说一下关键:重点是GDI+的DrawDriverString的功能,每个字符需要一个POINTF来定位,该POINTF的原点0,0不是左上角,而是左下角,X=字符左边界,Y(当为0时,实际值为字符行距,需要除以...
易语言GDI绘制窗口源码,GDI绘制窗口,画界面,写标题,画按钮,窗口最大化
GDI+ 动态 绘制矩形
GDI+绘制圆角矩形
c# gdi+ 地图绘制 读取坐标点 缩放 漫游 查询。
C# GDI+实现的网格绘制功能,同时,项目包含了GDI+的基本功能介绍和使用项目,工程使用vs2012编写,已通过编译。
易语言GDI绘制模块,可以用于自绘窗口。 开源模块内容,使用请自行编译。 支持绘制图片等,内容丰富。
gdi+ 绘制半透明 窗口,绘制png,非常有借鉴意义。欢迎交流
为方便实现和保护个人成果,该应用程序中绘制曲线的坐标点使用生成的随机数来实现,但同时保留了串口通信的相关代码,有需要的可自己修改(修改不会太大);该应用程序绘制的间隔时间是1s,也就是每隔1秒读取一次...
GDI+绘制运行的时钟 GDI+绘制时钟 GDI+时钟 C#绘制时钟 C#绘制的时钟
课上练习整理, 欢迎大家指正错误.
GDI+绘制动态曲线图演示,实现利用随机数据绘制成一段时间的实时动态的显示
Gdi+绘制窗口.rar Gdi+绘制窗口.rar Gdi+绘制窗口.rar Gdi+绘制窗口.rar Gdi+绘制窗口.rar Gdi+绘制窗口.rar
写了很长时间的一个控件,可以选择同时绘制两条曲线,代码都加上了注释,希望可以帮到需要的同学,不懂的地方可以私信我
使用GDI+技术绘制漂亮的按钮控件,可以换色,带渐变效果。
五个程序主要是讲解GDI 中怎么输出文字,绘制椭圆,矩形,使用画笔,画刷。