在Panel上绘图的实现
近期制作了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上绘图的实现的更多相关文章
- iOS:CALayer核心动画层上绘图
在CALayer上绘图: •要在CALayer上绘图,有两种方法: 1.创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图 2.设置 ...
- 在AChartEngine上绘图,手指标记当前位置
最近要做一个绘图项目,需要在ACE折线图上再绘出一条红标记当前坐标,经过这几天研究,可以给大家分享一下了.先上效果图吧! 代码里的注释还是比较清楚,就不作说明了. package com.exampl ...
- 用C++Builder在Windows开始按钮上绘图制作方法
熟悉Windows操作系统的软件设计人员知道,在Win95/98/NT/2000中有一任务栏(Task Bar)程序,路径为:C:\WINDOWS\SYSTEM\SYSTRAY.EXE(假设你的Win ...
- plotly线上绘图和离线绘图的区别
1.线上绘图 import plotly import plotly.plotly as py import plotly.graph_objs as go plotly.tools.set_cred ...
- C# GDI在控件上绘图
本文以以在chart控件上和窗体上画矩形为例子 不多解释了,代码很简单. 还有一些童鞋要别的源码,给我发邮箱吧 using System; using System.Collections.Gener ...
- Qt如何在QTabWidget上绘图
Qt绘图事件必须在paintEvent事件下绘图,这样导致我们在向Qt设计师界面上拖拽的控件绘图时,造成了很大的麻烦. 我们不能在拖拽的控件上写paintEvent函数,但是可以自定义一个类,继承某一 ...
- android 加载自定义图片并在图片上绘图
来源:毕设 关键词:Bitmap Canvas //毕设中需要自定义室内地图,并且在地图上绘制轨迹 //此处是一个测试Demo,实现图片的加载和记录手指在屏幕上的运动轨迹 图片的载入 使用系统提供的内 ...
- android 使用两个surfaceview 在摄像机画面上绘图
转载自http://blog.csdn.net/jesse__zhong/article/details/24934083 使用双surface,将第一个设置为透明背景,在摄像机上绘制图像,纠结搞了一 ...
- 关于hook d3d在war3上绘图的几点疑问
学到了. 你得记住,com接口全是stdcall调用方式,不是thiscall,不要搞错了,不信,你看接口定义 因为com调用得兼容c调用,而c没有thiscall调用方式stdcall时,this指 ...
随机推荐
- macOS免费的NTFS读写软件
Mounty for Mac brew cask install mounty
- 分布式项目中增加品牌前端页面出现Uncaught Error: [$injector:modulerr] bug后的原因以及改正方式
分布式查询品牌页面时 controller路径正确访问,比如输入 http://localhost:8081/brand/findPage.do?page=3&rows=6 是可以正常显示数据 ...
- linux IPC的FIFO
FIFO命名管道原型: #include <sys/stat.h> int mkfifo(const char *path, mode_t mode); int mkfifoat(int ...
- 如何将已经下造好的apk安装到eclipse本身的模拟器里面
参考资料:http://blog.csdn.net/zzp_403184692/article/details/7948212 在项目开发中,想将上一个版本的手机软件放到模拟器里面进行测试,但是如何操 ...
- jmeter 创建接口测试案例
1 怎么做接口测试? 一般情况下,由于我们项目前后调用主要是基于http协议的接口,所以测试接口时主要是通过工具或代码模拟http请求的发送和接收.所以我们下面整理了一下使用Jmeter工具进行htt ...
- 剑指offer——54数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 剑指offer——47把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题解: ...
- centos7下搭建nfs服务
现在有3台服务器 s1(主),s2(从), s3(从)需要实现文件实时同步,我们可以安装Nfs服务端和客户端来实现! 一.安装 NFS 服务器所需的软件包: yum install -y nfs-ut ...
- log4j.properties的详细配置
log4j.properties的详细配置 log4j.properties的maven配置 <dependency> <groupId>org.scala-lang</ ...
- 想成为顶尖 Java 程序员?先过了下面这些问题!
作者:rowkey https://zhuanlan.zhihu.com/p/31552882 一.数据结构与算法基础 说一下几种常见的排序算法和分别的复杂度. 用Java写一个冒泡排序算法 描述一下 ...