delphi绘图canvas及应用

Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析) Canvas属性实际上是一个TCanvas类型对象,它通过窗体对象的GetCanvas方法指向一个TCanvas类型对象。下面来介绍TCanvas类的常用属性和方法。Arc:通过该方法可以在界面上画一个弧,语法如下: Brush:由于确定会话填充的颜色和图案。CopyRect:将一块画布上的一个矩形区域复制到另一块画布上 Draw:画指定的一幅图案 DrawFocusRect:画焦点矩形(上一节代码里有示例) 运行结果如下: 我们需要在窗体上添加 Panel1、Paint 阅读详情

ELPHI为编程者提供了一个灵活的绘图场所,CANVAS类,在DELPHI中的很多控件都具有此属性,使编程者可以    
在这些控件的表面随心所欲的绘图,这对完善用户界面或者制作一些屏幕特技都有着非凡的作用。
   
一、CANVAS必备基本知识    
   
1.具有CANVAS属性的控件   
TBitmap,TComboBox,TDBComboBox,TDBGrid,TDBListBox,TDirectoryListBox, 
TDrawGrid,TFileListBox,TForm,THeaderControl,TImage,TListBox,TOutline, 
TPaintBox,TPrinter,TStatusBar,TStringGrid等。      
2.CANVAS属性及命令     
rectangle():画矩形 
roundrect():画圆角矩形   
arc():画弧线(不填充)     
chord():画弧线(填充)    
pie:画扇形 
Ellipse():画圆或椭圆    
polygon():画多边形填充   
polyline():多点连线(不填充) 
Pixels():指定固定象素点颜色值   
moveto():指明画线起点      
lineto():指明画线终点 

pen.color:定义画笔颜色 
pen.width:定义画笔宽度 
brush.color:定义填充颜色
textout():在固定位置输出字符串 
textwidth:取字符串高度 
textheight:取字符串宽度 
font.color:指定字体颜色 
font.size:指定字体大小

3.使用CANVAS注意事项
    当窗口进行重画时,画布上的图像将消失,比如当窗口进行最小化又重新恢复时,就会引起画布上图像的消失,另外当刚刚运行程序时,窗口也是属于重新绘制,所以如果在绘制窗口之前在画布上绘图

,弹出窗口后将不能显示出图像,比如在TForm1.FormCreate()事件中进行画布绘图操作将是徒劳的,但可以在此事件中进行画布操作的准备工作,比如设置画笔的颜色和宽度等。    
   
二、CANCAS应用举例   
   
1.为控件增加阴影或投影效果
    基本原理就是在利用该控件的父控件比如FORM或者其它容器控件的CANVAS,在需要修饰的控件周围适当处填加图像,通过线条及颜色的合理搭配,使控件与周围的图像融为一体,形成特殊的视觉效果,具体

操作时需要根据被修饰控件的TOP、LEFT、WIDTH、HEIGHT等属性,确定需要画线的起点和终点坐标,这样操作无论被修饰控件位置及尺寸如何变化,都可以保证投影及阴影效果完美的实现;比如可在窗口

中建立三个按钮,然后在按钮2和按钮3的CLICK事件中填加如下代码,之后按下按钮2或按钮3即使按钮1形成投影和阴影效果:   
   
procedure TForm1.Button2Click(Sender:TObject);    
var    
    i:integer;    
begin    
    form1.canvas.pen.width:=1;    
    for i:=0 to 8 do    
    begin    
      form1.canvas.pen.color:=$00a0a0a0;    
      form1.canvas.moveto(Button1.left+Button1.width+i,Button1.top+i);    
      form1.canvas.lineto(Button1.left+Button1.width+i,Button1.top+button1.height+i);    
      form1.canvas.pen.color:=$00606060;    
      form1.canvas.moveto(Button1.left+i,Button1.top+Button1.height+i);    
      form1.canvas.lineto(Button1.left+Button1.width+i,Button1.top+button1.height+i); 
    end;    
end;    
   
procedure TForm1.Button3Click(Sender:TObject);    
var    
    i:integer;    
begin   
    form1.canvas.pen.width:=1;    
    for i:=0 to 8 do    
    begin    
      form1.canvas.pen.color:=$00404040;    
      form1.canvas.moveto(Button1.left+Button1.width+i,Button1.top+8);    
      form1.canvas.lineto(Button1.left+Button1.width+i,Button1.top+button1.height+8);    
      form1.canvas.moveto(Button1.left+8,Button1.top+Button1.height+i);    
      form1.canvas.lineto(Button1.left+Button1.width+8,Button1.top+button1.height+i); 
    end;    
end;    
   
    
2.为控件加上边框
    DELPHI中有很多控件无边框属性,利用CANVAS可以为任意的控件填加边框,使其轮廓清楚;具体操作时,可先定义出画笔的颜色、画笔的宽度(边框宽度),之后用polyline()命令根据相应控件的位置、尺寸

自动定位四角坐标,一次可完成一个固定宽度矩形的绘制工作,如果需要多种颜色或者具有立体效果的边框,可多次定义画笔颜色,画出连续的多个矩形,通过调整相邻矩形的颜色来实现特殊效果的边框

绘制工作;比如在窗体中安放两个按钮,分别在MOUSEMOVE事件中填加如下代码,之后每当鼠标移到相应的按钮上时,相应的按钮就会出现特殊颜色的边框,当鼠标移到窗口空白处时,则窗口会出现明显的边线,

起到特殊的提示效果;    
   
procedure TForm1.Button1MouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);    
begin    
    form1.repaint;    
    form1.Canvas.pen.color:=clGreen;    
    form1.Canvas.pen.width:=5;    
    form1.Canvas.polyline([point(Button1.left,Button1.top),
                           point(Button1.left+Button1.width,Button1.top),
                           point(Button1.left+Button1.width,Button1.top+Button1.height),    
                           point(Button1.left,Button1.top+Button1.height),    
                           point(Button1.left,Button1.top)]);    
end;    
   
procedure TForm1.Button2MouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);    
begin    
    form1.repaint;    
    form1.Canvas.pen.color:=clBlue;    
    form1.Canvas.pen.width:=5;    
    form1.Canvas.polyline([point(Button2.left,Button2.top),    
                           point(Button2.left+Button2.width,Button2.top),    
                           point(Button2.left+Button2.width,Button2.top+Button2.height),    
                           point(Button2.left,Button2.top+Button2.height),    
                           point(Button2.left,Button2.top)]);    
end;    
   
procedure TForm1.FormMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);    
begin    
    form1.repaint;    
    form1.Canvas.pen.color:=clRed;    
    form1.Canvas.pen.width:=3;    
    form1.Canvas.polyline([point(0,0),
                           point(form1.width-10,0),    
                           point(form1.width-10,form1.height-35),    
                           point(0,form1.height-35),
                           point(0,0)]);    
end;    
   
   
   
3.为图形按钮或其它控件安装动态帮助功能
    此处主要使用它的字符串显示功能,也就是当鼠标移到指定控件上时,在其周围适当位置显示相应的字符串,当鼠标离开时通过图像覆盖动作使字符串消失,也可以使用一个简单的命令完成即

form1.repaint,它的作用是使FORM1内的所有控件全部重新绘制,这样即可快速清除原来显示的字符;编程时主要使用各个控件的MouseMove()事件;比如可在窗口中安放两个按钮,并安排如下代码,运行之后当

鼠标移到相应按钮上时,就会在其上方显示相应的提示信息,鼠标移到窗口空白处则会在窗口的左下角显示"OK"字样;      
   
procedure TForm1.Button1MouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);    
begin    
    form1.repaint;    
    form1.Canvas.brush.color:=clGreen;    
    form1.Canvas.font.size:=8;    
    form1.Canvas.font.color:=$1200ffff;    
    form1.Canvas.TextOut(Button1.left,Button1.top-15,'OPENFILE');    
end;    
   
procedure TForm1.Button2MouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);    
begin    
    form1.repaint;    
    form1.Canvas.font.size:=8;    
    form1.Canvas.brush.color:=clRed;    
    form1.Canvas.font.color:=$1200ffff;    
    form1.Canvas.TextOut(Button2.left,Button2.top-15,'EXIT');    
end;    
   
procedure TForm1.FormMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);    
begin    
    form1.repaint;    
    form1.Canvas.font.size:=12;    
    form1.Canvas.brush.color:=clBlue;    
    form1.Canvas.font.color:=$00ffffff;    
    form1.Canvas.TextOut(0,form1.height-50,'OK');    
end;     
   
   
4.仿电视移动字幕或图像
    实现移动字幕的方法是:首先选定一个可作为画布的控件,比如FORM或IMAGE,然后用一种填充颜色填满整个画布,在画布的固定位置显示一个特殊前景色固定尺寸的字符串,在TIMER控件中定时连续改变显

示字符串的位置,由于原来位置的字符串不能自动消失,所以需要用与填充颜色相同的线条覆盖多余部分,这样即可实现平滑的字幕移动效果;
    实现图像移动的方法是:可事先定义Bitmap类和Rect类变量,在程序运行阶段建立Bitmap和Rect对象,并在Bitmap中装入指定的图像文件,同时把对象Bitmap装入Rect对象中实现图像的显示,然后在Timer

控件中定时连续改变Rect的坐标值,并用与填充颜色相同的线条覆盖遗留图像部分,即可以实现图像的平稳移动;
    采用上述方法实现的字符串或图像移动操作,其效果平稳,无任何闪烁或抖动现象,视觉效果极佳,并且不需要事先建立控件,完全由程序代码实现,具有相当多的优点;
    编程举例:在窗体中安放时间控件TIMER1、图像框IMAGE1,定义TRECT及TBITMAP型变量,并在FormCreate和Timer1Timer事件中安排如下代码,程序运行之后即会在图像框中出现至下而上的移动字幕及图像

效果,并从顶部消失,之后重新从底部出现;      
   
var{定义变量}    
    Form1:TForm1;    
    x,tt,l,h:integer;    
    pic:Trect;    
    map:Tbitmap;    
{具体动画演示代码}    
procedure TForm1.Timer1Timer(Sender:TObject);    
begin    
    x:=x-1;//和背景同底色的字串向上移动1个高度,刚好覆盖上一次的显示内容    
    tt:=tt-1;//图片向上移动一个高度,不会完全覆盖上一次显示的图片,需要添加一条和底色同色的直线覆盖    
    if x<-160 then//所有字符和图片占用的总高度为80+80=160 
    x:=image1.height+20; 
    tt:=x+80; 
    image1.Canvas.font.size:=18; 
    image1.Canvas.font.color:=$1200ffff; 
    image1.Canvas.TextOut(10,x,'OK字幕移动演示'); 
    image1.Canvas.font.size:=12; 
    image1.Canvas.font.color:=$120000ff; 
    image1.Canvas.TextOut(20,x+50,'字体变色效果演示'); 
    //l:=image1.Canvas.textwidth('字体变色效果演示'); 
    //h:=image1.Canvas.textheight('字体变色效果演示'); 
    //image1.Canvas.pen.color:=clGreen; 
    //image1.Canvas.moveto(20,h+x+50-2); 
    //image1.Canvas.lineto(20+l,h+x+50-2); 
    pic.topleft.x:=30; 
    pic.topleft.y:=tt; 
    pic.bottomright.x:=pic.topleft.x+100; 
    pic.bottomright.y:=pic.topleft.y+80; 
    image1.canvas.stretchdraw(pic,map);//StretchDraw(Rect,Bitmap)将图象显示到指定的矩形空间里 
    image1.Canvas.pen.color:=clGreen; 
    image1.Canvas.moveto(0,pic.topleft.y+80); 
    image1.Canvas.lineto(pic.topleft.x+100,pic.topleft.y+80); 
end; 
{以下设置动画初值} 
procedure TForm1.FormCreate(Sender:TObject); 
begin 
    timer1.enabled:=true; 
    timer1.Interval:=10; 
    x:=image1.height+20; 
    tt:=x+80; 
    form1.repaint; 
    image1.Canvas.brush.color:=clGreen; 
    pic:=Rect(0,0,image1.width,image1.height); 
    image1.Canvas.FillRect(pic); 
    pic:=Rect(-1,-1,1,1); 
    map:=Tbitmap.create; 
    map.loadfromfile('d:/windows/256color.bmp'); 
    image1.canvas.stretchdraw(pic,map);     
end;

Delphi绘图功能[3] —— 使用Polyline、Polygon绘制多边形、System.Sin、System.Cos函数画圆 — 绘制五环图标 使用 Polygon 在画布上绘制一个封闭的多边形,使用 Pen 的值。在绘制完整的形状之后,使用 Brush 的值填充形状。通过在画布上绘制一条从最后一个点到第一个点的直线,在画布上绘制一系列连接传入和关闭形状的点的线。使用 Polyline 连接画布上的一组点。如果只指定两个点,Polyline 将绘制一条线。在窗体上添加两个Button组件(我这里是button7,button8)用当前钢笔在画布上绘制一系列直线,将传递给它的每个点连接起来。Point 参数是要连接的点的数组。 阅读详情

相关推荐

Delphi GDI+ 图形处理(2)

第一章           图像处理在可视化编程中的作用及其应用价值 图像处理,是可视化编程的基础内容。 在Windows操作系统中,一切要输出到屏幕上的东西都是通过图形处理这部分的内容来实现的。 比如一个程序使用了标签控件,它看起来似乎并没有用到什么图形处理,但实际上标签控件就是通过使用GDI库中的图形处理函数来实现的。可见图形处理在编程中的重要性。 图像处理在实际的应用中也极具价值。

流年~~ 4320

基于DELPHI的画图程序

该资源运用delphi语言制作的简单的画图程序,实现对直线、圆、矩形、曲线的绘制,可以对图形进行填充、放大缩小等。适合初学者学习借鉴。

Delphi 11 Canvas图形编程

CanvasDelphi绘图的主要手段,下面系统介绍Canvas的使用和方法 1.具有CANVAS属性的控件 TBitmap,TComboBox,TDBComboBox,TDBGrid,TDBListBox,TDirectoryListBox, TDrawGrid,TFileListBox,TForm,THeaderControl,TImage,TListBox,TOutline, TPaintBox,TPrinter,TStatusBar,TStringGrid等。 2.CANVAS属性及..

zxm8513CSDN博客 1725

Delphicanvas(画布)运用

Delphi canvas 画布,CANVAS必备基本知识,CANCAS应用举例

Delphi绘图功能[1] —— 入门(绘制直线和矩形)

使用圆角矩形绘制一个圆角矩形使用钢笔和填充它与画笔。矩形的边缘由点(X1,Y1) ,(X2,Y1) ,(X2,Y2) ,(X1,Y2)定义,但是角落将被修剪以创建一个圆形的外观。此函数绘制的矩形无法滚动。要滚动包含 DrawFocusRect 绘制的矩形的区域,请调用 DrawFocusRect 从屏幕上移除该矩形,滚动该区域,然后调用 DrawFocusRect 在新位置绘制该矩形。因为 DrawFocusRect 使用了一个 XOR 函数,所以在指定相同的矩形时第二次调用它会从屏幕中移除该矩形。

兴趣使然的编程菜鸟 4203

Delphicanvas(画布)

DELPHI编程者提供了一个灵活的绘图场所,即本文所述的CANVAS类,在DELPHI中的很多控件都具有此属性,使编程者可以在这些的控件的表面随心所欲的绘图,这对完善用户界面或者制作一些屏幕特技都有着非凡的作用,下面举例说明几种特殊屏幕效果的形成过程。一、CANVAS必备基本知识:1.具有CANVAS属性的控件:TBitmap...

weixin_33936401的博客 779

delphi绘图canvas应用(转)

<br />delphi绘图canvas应用2010年03月25日 星期四 14:59DELPHI编程者提供了一个灵活的绘图场所,CANVAS类,在DELPHI中的很多控件都具有此属性,使编程者可以    <br />在这些控件的表面随心所欲的绘图,这对完善用户界面或者制作一些屏幕特技都有着非凡的作用。 <br />一、CANVAS必备基本知识    <br />1.具有CANVAS属性的控件   <br />TBitmap,TComboBox,TDBComboBox,TDBGrid,TDBListBo

ericalbert的专栏 1万+

双缓冲绘图技术在Delphi中的实现

摘要:双缓冲绘图技术在Delphi中的实现说明:假设读者熟悉VCL 双缓冲绘图也不是什么新技术,简单的说:在绘图实现时不直接绘在窗口上,而是先绘在内存里,再一起“拷贝”至窗口。实现起来也不复杂,创建一兼容HDC,在此兼容HDC上绘图,最后拷贝到窗口HDC就行了。本人前段时间把一C++实现该技术的代码改成了Delphi代码,都是用Win32API写的。今改成了使用Delphi自带的类,试

mrpan09的专栏 1747

delphi canvas使用

DELPHI编程者提供了一个灵活的绘图场所,即本文所述的    CANVAS类,在DELPHI中的很多控件都具有此属性,使编程者可以    在这些的控件的表面随心所欲的绘图,这对完善用户界面或者制    作一些屏幕特技都有着非凡的作用,下面举例说明几种特殊屏幕    效果的形成过程。       一、CANVAS必备基本知识:       1.具有CANVAS属性的控件:    TBitmap

musa2008的专栏 1164

Delphi GDI+ 绘图 (1)

本文链接:https://blog.csdn.net/lailai186/article/details/8760541 绘图需要有纸、画笔、画刷; DelphiCanvas、Pen、Brush. Canvas:就是画布, 譬如窗体的 Canvas 属性, 就是窗体的画布; Pen :是画笔, 可以设置笔色、笔宽等等; Brush: 是画刷, 可以设置填充颜色等等. //举例: {绘制...

qq_18932003的博客 658

Delphi开发简单的画图软件

Delphi7开发实现的画图软件源代码,可画出给定的圆形、矩形、直线等图形,选择图形后在右侧空白处点击,就可画出图形,还可选择颜色,并图形进行填充,不过功能上来说确实是比较单一的,甚至没有Windows自带的画图功能强大,作为Delphi编程新手,学习一下是有益无害的。

Delphi Shadow窗口阴影立体效果.rar

Delphi 制作立体窗口阴影效果,这个阴影看上去很明显,不过不是线性的,线性的实现起来要比这种阴影复杂一些。   ShadowWidth:integer; //用于确定阴影的宽度或高度   RightShadow:TForm; //主窗口的右边产生一个阴影窗口   BottomShadow:TForm; //主窗口的下部产生一个阴影窗口   procedure WMWindowPosChanged(var Msg:TWMWindowPosChanged);message wm_windowposchanged;

Delphicanvas(画布)的运用

DELPHI编程者提供了一个灵活的绘图场所,即本文所述的CANVAS类,在DELPHI中的很多控件都具有此属性,使编程者可以在这些的控件的表面随心所欲的绘图,这对完善用户界面或者制作一些屏幕特技都有着非凡的作用,下面举例说明几种特殊屏幕效果的形成过程。一、CANVAS必备基本知识:1.具有CANVAS属性的控件:...

weixin_33738555的博客 736

由双缓冲绘图技术谈起到Delphi源码实现

由双缓冲绘图技术谈起到Delphi源码实现(本文原创,转载请申明)xiaoyunsoft@163.com 摘要:双缓冲绘图技术在Delphi中的实现说明:假设读者熟悉VCL 双缓冲绘图也不是什么新技术,简单的说:在绘图实现时不直接绘在窗口上,而是先绘在内存里,再一起“拷贝”至窗口。实现起来也不复杂,创建一兼容HDC,在此兼容HDC上绘图,最后拷贝到窗口HDC就行了。本人

小大的专栏 6046

利用DELPHICanvas绘图

  以往开发Windows图形软件大多用 VC++作为开发工具,VC++强大的图形功能可以让程序员编制出许多优秀的与图形相关的软件。VC++中与绘图相关的函数都封装在CDC及其衍生的CClientDC,CpaintDC,CwindowDC中。Delphi中也有一个与CDC相类似的类Tcanvas, 它封装了Delphi 中的绘图函数。我们可以把Delphi和VC中相同或相近的方法做个有趣的比较

【拥抱变化 -- 知识改变命运】 2万+

Delphi绘图功能

//TPen 的主要属性有四: Color、Width、Style、Mode              {Color: 颜色}              {Width: 宽度; 默认是 1; 如果赋予            {Style: 样式; Delphi 定义了笔样式枚举 TPenStyle, 包含以下样式:}       psSolid       = 0; {实线}  

阳光小飞鱼's Blog 2381
上一篇: delphi canvas 属性知识
下一篇: 获取本机IP和计算机名
hyz_cs
博客等级 码龄19年 65粉丝 5原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值