Delphi中canvas(畫布)的運用

在DELPHI爲編程者提供了一個靈活的繪圖場所,即本文所述的    
CANVAS類,在DELPHI中的很多控件都具有此屬性,使編程者可以    
在這些的控件的表面隨心所欲的繪圖,這對完善用戶界面或者制    
作一些屏幕特技都有着非凡的作用,下面舉例說明幾種特殊屏幕    
效果的形成過程。    
   
一、CANVAS必備基本知識:    
   
1.具有CANVAS屬性的控件:    
TBitmap,TComboBox,TDBComboBox,TDBGrid,TDBListBox,TDirectoryListBox,  
TDrawGrid,TFileListBox,TForm,THeaderControl,TImage,TListBox,TOutline,  
TPaintBox,TPrinter,TStatusBar,TStringGrid等,    
   
2.CANVAS屬性及命令:篇幅所限,省略參數及格式說明,具體請參考文後程序及DELPHI幫助文件:    
   
canvas.rectangle():畫矩形pen.color:定義畫筆顏色    
roundrect():畫圓角矩形pen.width:定義畫筆寬度    
arc():畫弧線(不填充) brush.color:定義填充顏色    
chord():畫弧線(填充) textout():在固定位置輸出字符串    
pie:畫扇形 textwidth:取字符串高度    
polygon():畫多邊形填充textheight:取字符串寬度    
polyline():多點連線(不填充)font.color:指定字體顏色    
Pixels():指定固定象素點顏色值font.size:指定字體大小    
moveto():指明畫線起點 Ellipse():畫圓或橢圓    
lineto():指明畫線終點    
   
   
3.使用CANVAS注意事項:當窗口進行重畫時,畫布上的圖像將消    
失,比如當窗口進行最小化又重新恢復時,就會引起畫布上圖像    
的消失,另外當剛剛運行程序時,窗口也是屬於重新繪製,所以    
如果在繪製窗口之前在畫布上繪圖,彈出窗口後將不能顯示出圖    
像,比如在TForm1.FormCreate()事件中進行畫布繪圖操作將是    
徒勞的,但可以在此事件中進行畫布操作的準備工作,比如設置    
畫筆的顏色和寬度等。    
   
二、CANCAS應用舉例:    
   
1.爲控件增加陰影或投影效果:基本原理就是在利用該控件的父    
控件比如FORM或者其它容器控件的CANVAS,在需要修飾的控件周    
圍適當處填加圖像,通過線條及顏色的合理達配,使控件與周圍的    
圖像融爲一體,形成特殊的視覺效果,具體操作時需要根據被修飾    
控件的TOP、LEFT、WIDTH、HEIGHT等屬性,確定需要畫線的起    
點和終點座標,這樣操作無論被修飾控件位置及尺寸如何變化,    
都可以保證投影及陰影效果完美的實現;比如可在窗口中建立三    
個按鈕,然後在按鈕2和按鈕3的CLICK事件中填加如下代碼,之    
後按下按鈕2或按鈕3即使按鈕1形成投影和陰影效果:    
   
   
procedure TForm1.Button2Click(Sender:TObject);    
var    
x,y,i:integer;    
begin    
x:=0;y:=0;    
form1.canvas.pen.width:=1;    
fori:=0to8do    
begin    
form1.canvas.pen.color:=$00a0a0a0;    
form1.canvas.moveto(Button1.left+Button1.width+x,    
Button1.top+y);    
form1.canvas.lineto(Button1.left+Button1.width+x,    
Button1.top+button1.height+y);    
form1.canvas.pen.color:=$00606060;    
form1.canvas.moveto(Button1.left+x,    
Button1.top+Button1.height+y);    
form1.canvas.lineto(Button1.left+Button1.width+x,    
Button1.top+button1.height+y);    
x:=x+1;    
y:=y+1;    
end;    
end;    
   
procedure TForm1.Button3Click(Sender:TObject);    
var    
x,y,i:integer;    
begin    
x:=0;y:=0;    
form1.canvas.pen.width:=1;    
fori:=0to8do    
begin    
form1.canvas.pen.color:=$00404040;    
form1.canvas.moveto(Button1.left+Button1.width+x,    
Button1.top+8);    
form1.canvas.lineto(Button1.left+Button1.width+x,    
Button1.top+button1.height+8);    
form1.canvas.moveto(Button1.left+8,    
Button1.top+Button1.height+y);    
form1.canvas.lineto(Button1.left+Button1.width+8,    
Button1.top+button1.height+y);    
x:=x+1;    
y:=y+1;    
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.hei    
ght),    
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.hei    
ght),    
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-30),    
point(0,form1.height-30),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;    
tt:=tt-1;    
ifx<-160then 
x:=p_w_picpath1.height+20; 
tt:=x+80; 
p_w_picpath1.Canvas.font.size:=18; 
p_w_picpath1.Canvas.font.color:=$1200ffff; 
p_w_picpath1.Canvas.TextOut(10,x,'OK字幕移動演示'); 
p_w_picpath1.Canvas.font.size:=12; 
p_w_picpath1.Canvas.font.color:=$120000ff; 
p_w_picpath1.Canvas.TextOut(20,x+50,'字體變色效果演示'); 
l:=p_w_picpath1.Canvas.textwidth('字體變色效果演示'); 
h:=p_w_picpath1.Canvas.textheight('字體變色效果演示'); 
p_w_picpath1.Canvas.pen.color:=clGreen; 
p_w_picpath1.Canvas.moveto(20,h+x+50-2); 
p_w_picpath1.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; 
p_w_picpath1.canvas.stretchdraw(pic,map); 
p_w_picpath1.Canvas.pen.color:=clGreen; 
p_w_picpath1.Canvas.moveto(0,pic.topleft.y+80); 
p_w_picpath1.Canvas.lineto(pic.topleft.x+100,pic.topleft.y+80) 

end; 
{以下設置動畫初值} 
procedure TForm1.FormCreate(Sender:TObject); 
begin 
timer1.enabled:=true; 
timer1.Interval:=10; 
x:=p_w_picpath1.height+20; 
tt:=x+80; 
form1.repaint; 
p_w_picpath1.Canvas.brush.color:=clGreen; 
pic:=Rect(0,0,p_w_picpath1.width,p_w_picpath1.height); 
p_w_picpath1.Canvas.FillRect(pic); 
pic:=Rect(-1,-1,1,1); 
map:=Tbitmap.create; 
map.loadfromfile('d:\windows\256color.bmp'); 
p_w_picpath1.canvas.stretchdraw(pic,map); 
end; 


更多參考:100腳本網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章