DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a12315
今日帖子: 43
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
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的原因吗?哪位盒友,知道问题出在哪里吗?还请知道的朋友不吝赐教,谢谢!
此帖子包含附件:
PNG 图像
大小:32.2K
----------------------------------------------
18114532@qq.com
作者:
男 kinneng (kinneng) ★☆☆☆☆ -
盒子活跃会员
2017/5/27 8:36:50
1楼: 系统API绘制文本的时候,只管用最接近大小的字体进行绘制,保证看上去不走样,但比例无法保证。

要想得到完美的文本缩放效果,得把字体加大两倍绘制到新建的Canvas上(建一个TBitmap),之后再CopyRect把像素拷贝出来,其实最好用GDI+,有反锯齿,否则效果很差,最好的方法是绕过系统,自己解释绘制字体,不过太复杂了。
----------------------------------------------
声明:本人不在论坛询问任何编程问题,请不要将我的帖子当成问题来回答。炒股一天,编程三年,不浪费时间了。 经常在外面,没空,不要找我..
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2017/5/28 15:09:04
2楼: 感谢你提供的思路,让我有了个新的想法,先验证一下。
----------------------------------------------
18114532@qq.com
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2017/6/1 9:06:28
3楼: 一直都用MM_TEXT模式,其他模式有个不好解决的问题,忘了是啥了,好像是鼠标定位还是编辑光标定位的问题。
----------------------------------------------
-
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2017/6/23 9:16:08
4楼: 这个问题后来解决了,使用一个全局的临时Canvas变量,放大后绘制时的尺寸通过这个临时的Canvas计算,然后绘制即可,这样可以保证计算的一致性。
----------------------------------------------
18114532@qq.com
作者:
男 bigboy2050 (bigboy2050) ★☆☆☆☆ -
普通会员
2017/6/23 10:06:39
5楼: 厉害了,楼主大侠!!!
----------------------------------------------
kittyapp
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS