|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2017/5/26 22:41:14 |
标题: |
熟悉绘图的朋友帮忙看一下视图放大的问题 |
浏览:1243 |
|
加入我的收藏 |
楼主: |
在做一个文本排版程序,通过修改映射模式实现放大,发现一个问题好几天了没有结果,各位朋友可用下面的代码测试。
procedure TForm9.FormPaint(Sender: TObject); var vOldWinExt, vOldViewExt: TSize; vLeft, vTop, vWidth, vHeight: Integer; vS: string; vDrawRect: TRect; begin Canvas.Font.Name := '宋体'; Canvas.Font.Size := 11;
vLeft := 10; vTop := 10; vS := '0123456789abcd';
vWidth := Canvas.TextWidth(vS); // 值为112 Caption := IntToStr(vWidth); vHeight := Canvas.TextHeight(vS); vDrawRect := Bounds(vLeft, vTop, vWidth, vHeight); // 放大视图2倍 SetMapMode(Canvas.Handle, MM_ANISOTROPIC); SetWindowExtEx(Canvas.Handle, Width, Height, @vOldWinExt); SetViewportExtEx(Canvas.Handle, Width * 2, Height * 2, @vOldViewExt);
Canvas.Brush.Color := clYellow; Canvas.FillRect(vDrawRect); Canvas.TextOut(vLeft, vTop, vS); vWidth := Canvas.TextWidth(vS); // 值为 105 Caption := Caption + '-' + IntToStr(vWidth); end;
实际的效果如图,发现区域是放大了2倍,但是测量字符串的宽度反而减小了(由放大前的112变成了105),这样造成原来紧挨文本宽度后面要绘制的东西和文本中间出现了间距。
是因为字体不是TrueType的原因吗?哪位盒友,知道问题出在哪里吗?还请知道的朋友不吝赐教,谢谢!
此帖子包含附件:
大小:32.2K |
----------------------------------------------
18114532@qq.com |
作者: |
|
2017/5/27 8:36:50 |
1楼: |
系统API绘制文本的时候,只管用最接近大小的字体进行绘制,保证看上去不走样,但比例无法保证。
要想得到完美的文本缩放效果,得把字体加大两倍绘制到新建的Canvas上(建一个TBitmap),之后再CopyRect把像素拷贝出来,其实最好用GDI+,有反锯齿,否则效果很差,最好的方法是绕过系统,自己解释绘制字体,不过太复杂了。
----------------------------------------------
声明:本人不在论坛询问任何编程问题,请不要将我的帖子当成问题来回答。炒股一天,编程三年,不浪费时间了。 经常在外面,没空,不要找我..
|
作者: |
|
2017/5/28 15:09:04 |
2楼: |
感谢你提供的思路,让我有了个新的想法,先验证一下。
----------------------------------------------
18114532@qq.com
|
作者: |
|
2017/6/1 9:06:28 |
3楼: |
一直都用MM_TEXT模式,其他模式有个不好解决的问题,忘了是啥了,好像是鼠标定位还是编辑光标定位的问题。
----------------------------------------------
-
|
作者: |
|
2017/6/23 9:16:08 |
4楼: |
这个问题后来解决了,使用一个全局的临时Canvas变量,放大后绘制时的尺寸通过这个临时的Canvas计算,然后绘制即可,这样可以保证计算的一致性。
----------------------------------------------
18114532@qq.com
|
作者: |
|
2017/6/23 10:06:39 |
5楼: |
厉害了,楼主大侠!!!
----------------------------------------------
kittyapp
|
|