一个绘制虚线的非常规函数(常规方法,打印机上绘制不出虚线)

简介:

    昨天碰到一个灰常的,郁闷之极的问题!在打印机上,竟然使用Delphi的常规方式绘制虚线的时候,竟然显示的始终是实线。

我们常规绘制虚线的方法很简单的,就是指定Canvas的PenStyle为虚线模式就可以了。代码简单了

Canvas.pen.style := psdot;

canvas.pen.color := clred;

canvas.moveto(20,30);

canvas.lineto(800,800);

这样绘制在窗体上,就可以画一条虚线咯。可是用这个绘制到打印机上,就不行了,在打印机画布上,用这个相同的代码,执行之后,实际上打印机打印出来的是实线。在这个破地方蛋疼了半天,打印的代码又多,前后来来回回的找可能出现问题的地方,找了半天都没发现神马问题,于是转而用纯API来写

tempPen := CreatePen(PS_DASH,1,clred);

selectObject(canvas.Handle,tempPen);

MovetoEx(Canvas.Handle,20,30,nil);

lineto(Canvas.Handle,800,800);

deleteobject(tempPen);

这样写了之后,还是一样的蛋疼。显示的还是实线。后来蛋疼的没办法了,找了半天也招不到问题所在!之后在网上谷歌一番。网上提出了一个更加蛋疼的方案,先把虚线画到一个位图上,然后再在打印机上输出位图。很不淡定的方案。看来这个问题,可能就是系统的问题了。于是恨不淡定的自己写了一个绘制虚线的函数。

直线的虚线条绘制,其实简单。X,Y上可以用多个小线段一条一条的模拟过去,如果是倾斜的斜线,可以计算出斜率,然后同时计算X,Y的步进步长,然后在一个一个的绘制小短线段,虚线就由小短线段组成了。

贴代码把

复制代码

  
  
procedure DrawVirtualLine(Cvs: TCanvas;FromP,ToP: TPoint);
var
i: integer;
Xl: Single;
x,y: Integer;
begin
Cvs.MoveTo(FromP.x,FromP.y);
if FromP.x = ToP.X then
begin
i :
= FromP.Y;
while i <= ToP.Y do
begin
Cvs.LineTo(FromP.x,i
+ 1 );
Cvs.MoveTo(FromP.X,i
+ 4 );
Inc(i,
4 );
end ;
end
else if FromP.Y = ToP.Y then
begin
i :
= FromP.X;
while i <= Top.X do
begin
Cvs.LineTo(i
+ 1 ,FromP.y);
Cvs.MoveTo(i
+ 4 ,FromP.y);
Inc(i,
4 );
end ;
end
else
begin
Xl :
= (ToP.Y - FromP.Y) / (ToP.X - FromP.x);
if Abs(xl) >= 1 then
begin
i :
= FromP.x;
y :
= FromP.Y;
if FromP.X < ToP.X then
while i <= ToP.X do
begin
Cvs.LineTo(i
+ 1 ,y + trunc(Xl));
y :
= y + Trunc(xl * 2 );
Cvs.MoveTo(i
+ 2 ,y);
Inc(i,
2 );
end
else
while i >= ToP.X do
begin
Cvs.LineTo(i
- 1 , y - Trunc(Xl));
y :
= y - Trunc(xl * 2 );
Cvs.MoveTo(i
- 2 ,y);
dec(i,
2 );
end ;
end
else
begin
i :
= FromP.Y;
x :
= FromP.X;
if FromP.y < ToP.y then
while i <= ToP.Y do
begin
Cvs.LineTo(x
+ trunc( 1 / xl),i + 1 );
x :
= x + Trunc( 2 / xl);
Cvs.MoveTo(x,i
+ 2 );
Inc(i,
2 );
end
else
while i >= ToP.Y do
begin
Cvs.LineTo(x
- Trunc( 1 / Xl),i - 1 );
x :
= x - Trunc( 2 / Xl);
cvs.MoveTo(x,i
- 2 );
Dec(i,
2 );
end ;
end ;
end ;
end ;
复制代码

用法


  
  
Canvas.Pen.Color : = clred;
DrawVirtualLine(Canvas,Point(
30 , 80 ),Point( 10 , 120 ));
DrawVirtualLine(Canvas,Point(
10 , 120 ),Point( 70 , 60 ));
DrawVirtualLine(Canvas,Point(
70 , 60 ),Point( 30 , 80 ));


本文转自 不得闲 博客园博客,原文链接: http://www.cnblogs.com/DxSoft/archive/2011/04/28/2031537.html ,如需转载请自行联系原作者

相关文章
|
3天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1096 0
|
12天前
|
人工智能 运维 安全
|
2天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
436 9
|
11天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
3天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
292 0
|
10天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
795 23
|
3天前
|
缓存 供应链 监控
VVIC seller_search 排行榜搜索接口深度分析及 Python 实现
VVIC搜款网seller_search接口提供服装批发市场的商品及商家排行榜数据,涵盖热销榜、销量排名、类目趋势等,支持多维度筛选与数据分析,助力选品决策、竞品分析与市场预测,为服装供应链提供有力数据支撑。
|
3天前
|
缓存 监控 API
Amazon item_review 商品评论接口深度分析及 Python 实现
亚马逊商品评论接口(item_review)可获取用户评分、评论内容及时间等数据,支持多维度筛选与分页调用,结合Python实现情感分析、关键词提取与可视化,助力竞品分析、产品优化与市场决策。