|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2015/12/28 18:32:44 |
标题: |
“GDI+中获得字符串准确长度的方法”一波三折 |
浏览:2038 |
|
加入我的收藏 |
楼主: |
开发mcool播放器过程中,头痛于GDI+如何准确测量字符串长度很久了,近来看到盒子一个帖子“GDI+中获得字符串准确长度的方法”http://2ccc.com/article.asp?articleid=6562,大喜过望,可惜死活下载不了,大概是从ftp服务器删除了。于是搜索“GDI+中获得字符串准确长度的方法”,来到这里http://bbs.csdn.net/topics/390712117,获知MeasureCharacterRanges这个方法,可是不会用啊,于是决定到万一老师那里看看,果然有http://www.cnblogs.com/del/archive/2009/12/22/1629717.html,很详细,归纳了一下,如下:
function TMainForm.MeasureStr(s: WideString): TGpRectF; var StringFormat: TGPStringFormat; g:TGPGraphics; CharRange1: TCharacterRange; CharRanges: array of TCharacterRange; Regions: array of TGpRegion; f:TGPFont; begin StringFormat := TGPStringFormat.Create; StringFormat.FormatFlags:=[sfMeasureTrailingSpaces]; SetLength(CharRanges,1); SetLength(Regions,1); Regions[0]:=TGpRegion.Create; CharRange1.First:=0; CharRange1.Length:=Length(s); CharRanges[0] := CharRange1; StringFormat.SetMeasurableCharacterRanges(Charranges);
g:=TGPGraphics.Create(Self.Canvas.Handle); f:=TGPFont.Create(Self.Canvas.Handle);
g.MeasureCharacterRanges(s, f, GpRect(0.0,0,ClientWidth,ClientHeight), StringFormat, Regions); Regions[0].GetBounds(Result, g); f.Free; g.Free; Regions[0].Free; StringFormat.Free; end;
微软也是,搞得这么复杂,不会直接封装一个么?
注:我用的是阿发伯大侠提供的GDIPlus
----------------------------------------------
http://mcool.appinn.me/ |
作者: |
|
2015/12/28 18:39:45 |
1楼: |
微软真的是神,只能这么理解。这是我在网上看到一篇博客上这么说的,他是在研究使用WebBrowser的接口时发出的感慨。另外就是,VCL这么强大的基础类库,也只用到了微软API的很小一部分,有了这些API就可以做出无限多的扩展(比如自己实现TForm的ShowModal,完全废弃了微软提供的Dialog模板)。
它为什么不提供封装?我的理解是,它这辈子也做不完这样的封装,而且也不一定做的比第三方更好,干脆就不做了。对于这一点有许多例子可以作证。
----------------------------------------------
只有偏执狂才能生存!
|
作者: |
sqlnew (sqlnew) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2015/12/28 19:20:39 |
2楼: |
或许是微软出于商业性考虑吧.比如安全方面的cryptoapi,研究过的都知道里面的东西实在太强大了,还有CSP服务接口,作为中间件的usb key 等编程.还有office的编程接口,先不计非公开的,就算是公开的那些每个组件的接口那是太多了,就算拿这些扩展功能接口都可以做出非常强大的功能,但总感觉微软对这些东西藏着,捂着,有些就是没有公开的详细文档,对开发人员非常不友好...
----------------------------------------------
-
|
作者: |
|
2015/12/28 20:23:42 |
3楼: |
学习
----------------------------------------------
-
|
作者: |
|
2015/12/29 8:44:48 |
4楼: |
不奇怪,一方面可能是历史遗留问题,另一方面微软需要保持垄断地位,搞得复杂一些,别人就不容易弄明白,而它自己可能用另外一套直接的API ^o^
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
|
作者: |
msfm (清洁工) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2015/12/29 9:25:28 |
5楼: |
顶4楼 以后我也搞的复杂一点 别他妈一看就明白 没点技术含量
----------------------------------------------
-
|
作者: |
|
2015/12/29 9:27:35 |
5楼: |
垄断地位不是靠复杂建立的,是靠用户数量确定的。 微软巴不得二次开发简单的都不用写代码,支持的厂商越多,越容易垄断。想想IOS就明白了。
----------------------------------------------
-
|
作者: |
sqlnew (sqlnew) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2015/12/29 10:36:57 |
6楼: |
微软以前就是以为搞封闭,把开发搞的复杂和高大上,什么都藏着捂着,就可以保持垄断地位。但之后被移动端、安卓、IOS等冲击,正如上楼说的,用户接受才是最终目地,那些高深强大的隐藏功能就慢慢的随着时间烂掉了。最近微软好像明白了,又开始搞开源、搞跨平台、回归讨好开发者等。
----------------------------------------------
-
|
作者: |
|
2015/12/29 19:50:09 |
7楼: |
微软没有必要为垄断干些什么,其他公司的系统,根本就是烂泥扶不上壁,Windows不仅强大,也非常庞大,移动系统冲击不了什么。
----------------------------------------------
声明:本人不在论坛询问任何编程问题,请不要将我的帖子当成问题来回答。炒股一天,编程三年,不浪费时间了。 经常在外面,没空,不要找我..
|
作者: |
|
2015/12/30 9:07:30 |
8楼: |
微软当初是靠庞大的程序员撑起来,所以搞了net这套东西,就是想把程序员都从linux阵营都拉过来,delphi也是受到了这样的冲击.
然而在移动开发这块,没人买微软的账了,看看WP的app就知道了,不是微软你的移动os做得太烂,而是没app的os没人用.
----------------------------------------------
|
|