近期制作了FDS的一个建模工具,由于知识有限,做出的效果是2D的。昨天上课的时候看老师画一个长方体,突然想到,为什么不给普通的2D图形加画上几条直线,就能实现2D图形的3D视觉效果呢?于是回来马上做了尝试,果然,效果很好,非常满意。但是把测试程序代码移植到FDS建模工具上的时候出现问题了:Panel没有Canvas属性,也不能说没有,实际上在TPanel的实现源码里有Canvas属性,不过是Protected不允许外部访问。怎么办?简单思考了一下,有这么几个方向:

一、把Panel设置成透明的,在Form的Canvas上绘画图形

二、在Panel里面加一个有Canvas属性的组件,然后在那上面绘图

三、想办法在Panel本身上实现画图的方法

通过查资料,改源程序代码,发现方案一,画出的图形总是被Panel本身遮挡(这是由于我程序本身的需要,Panel里面也要套一层Panel),没有找到好的解决办法。

方案二:在Panel里面加了一个Image组件,但引发了更多问题:由于组件是动态生成了,产生了比如如何确定在哪个组件添加的Image,另外Image挡住了Panel的事件响应。总之也是没有很好的解决。

走了很多很多弯路后才最后走到第三步。最后在台湾的一个Delphi论坛上找到了类似的问题:如何在Panel组件上定点写字http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=70988源码是C++的,我以前学过一点C++就根据自己的理解转换成了Delphi的,可能有不对的地方,但没想到一运行居然成功了!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

uses Math;

procedure TForm1.pnl1Click(Sender: TObject);

var

Panel:TPanel;

PanelCanvas:TControlCanvas;

begin

PanelCanvas:=TControlCanvas.Create;

PanelCanvas.Control:=pnl5;

Panel:=sender as TPanel;

with PanelCanvas do

begin

pen.Color:=clGreen;

MoveTo(Panel.Left,Panel.Top);

LineTo(Panel.left+round(Panel.Height/sqr(2)),Panel.top-round(Panel.Height/sqr(2)));

LineTo(Panel.left+Panel.Width+round(Panel.Height/sqr(2)),Panel.top-round(Panel.Height/sqr(2)));

LineTo(Panel.left+Panel.Width,Panel.top);

MoveTo(Panel.Left+Panel.Width,Panel.Top+Panel.Height);

LineTo(Panel.left+Panel.Width+round(Panel.Height/sqr(2)),Panel.top+Panel.Height-round(Panel.Height/sqr(2)));

LineTo(Panel.left+Panel.Width+round(Panel.Height/sqr(2)),Panel.top-round(Panel.Height/sqr(2)));

end;

PanelCanvas.Free;

end;

成功的关键在TControlCanvas的使用,TControlCanvas的Control属性使得Panel的Canvas属性可以被访问使用。

看看TControlCanvas的Control属性说明:Specifies the control associated with the control canvas object.

在Panel上绘图的实现的更多相关文章

  1. iOS:CALayer核心动画层上绘图

    在CALayer上绘图: •要在CALayer上绘图,有两种方法: 1.创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图 2.设置 ...

  2. 在AChartEngine上绘图,手指标记当前位置

    最近要做一个绘图项目,需要在ACE折线图上再绘出一条红标记当前坐标,经过这几天研究,可以给大家分享一下了.先上效果图吧! 代码里的注释还是比较清楚,就不作说明了. package com.exampl ...

  3. 用C++Builder在Windows开始按钮上绘图制作方法

    熟悉Windows操作系统的软件设计人员知道,在Win95/98/NT/2000中有一任务栏(Task Bar)程序,路径为:C:\WINDOWS\SYSTEM\SYSTRAY.EXE(假设你的Win ...

  4. plotly线上绘图和离线绘图的区别

    1.线上绘图 import plotly import plotly.plotly as py import plotly.graph_objs as go plotly.tools.set_cred ...

  5. C# GDI在控件上绘图

    本文以以在chart控件上和窗体上画矩形为例子 不多解释了,代码很简单. 还有一些童鞋要别的源码,给我发邮箱吧 using System; using System.Collections.Gener ...

  6. Qt如何在QTabWidget上绘图

    Qt绘图事件必须在paintEvent事件下绘图,这样导致我们在向Qt设计师界面上拖拽的控件绘图时,造成了很大的麻烦. 我们不能在拖拽的控件上写paintEvent函数,但是可以自定义一个类,继承某一 ...

  7. android 加载自定义图片并在图片上绘图

    来源:毕设 关键词:Bitmap Canvas //毕设中需要自定义室内地图,并且在地图上绘制轨迹 //此处是一个测试Demo,实现图片的加载和记录手指在屏幕上的运动轨迹 图片的载入 使用系统提供的内 ...

  8. android 使用两个surfaceview 在摄像机画面上绘图

    转载自http://blog.csdn.net/jesse__zhong/article/details/24934083 使用双surface,将第一个设置为透明背景,在摄像机上绘制图像,纠结搞了一 ...

  9. 关于hook d3d在war3上绘图的几点疑问

    学到了. 你得记住,com接口全是stdcall调用方式,不是thiscall,不要搞错了,不信,你看接口定义 因为com调用得兼容c调用,而c没有thiscall调用方式stdcall时,this指 ...

随机推荐

  1. 特种设备TSG 认证流程

    特种设备许可,也叫安全注册(原为AZ安全注册认可),现为TS.国家为了防止和减少事故,保障人民群众生命和财产安全,促进经济发展而强制实施的安全监察.它的作用相当于欧盟的“CE”认证,但比“CE”认证更 ...

  2. Ajax请求参数为文件类型

    1.图片用get请求,回调函数中返回的数据就是流文件(至于是什么流文件还不清楚), 在回调函数中再使用post请求2.JS将文件像form表单一样提交到后台  :  https://www.cnblo ...

  3. mongodb副本集(选举,节点设置,读写分离设置)

    1.相对于传统主从模式的优势 传统的主从模式,需要手工指定集群中的Master.如果Master发生故障,一般都是人工介入,指定新的Master.这个过程对于应用一般不是透明的,往往伴随着应用重新修改 ...

  4. Java进程Runtime、Process、ProcessBuilder调用外部程序

    原文地址:https://blog.csdn.net/c315838651/article/details/72085739 通过Java执行系统命令,与cmd中或者终端上一样执行shell命令,最典 ...

  5. tensorflow 训练最后预测结果为一个定值,可能的原因

    训练一个分类网络,没想到预测结果为一个定值. 找了很久发现,是因为tensor的维度的原因.  注意:我说的是我的label数据的维度. 我的输入是: y_= tf.placeholder(tf.in ...

  6. hql 跟 sql 区别

    hql 跟 sql 区别  1.hql与sql的区别 sql 面向数据库表查询 hql 面向对象查询 hql : from 后面跟的 类名+类对象 where 后 用对象的属性做条件 sql: fro ...

  7. 全网最热Python3入门+进阶 更快上手实际开发✍✍✍

    全网最热Python3入门+进阶 更快上手实际开发  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问 ...

  8. 净心诀---python3装饰器

    python3装饰器 装饰器作用 简单理解:可以为已有函数添加额外功能 例: 已有2个函数如下 def MyFunc1(): print("This is a print function1 ...

  9. idea一直在copying resources或者一直在build,卡住不动,问题已解决

    IDE在启动项目的过程中,一直copying,或者是build一直卡住,需要在modules中配置下,把target文件夹移出resource folder 同时,在此之前,我还屏蔽了项目中pom.x ...

  10. Pregel的执行过程