?? 圖形控制技巧.htm
字號(hào):
<html><head><style type="text/css"><!--.p9 { font-family: "宋體"; font-size: 9pt}a {text-transform: none; text-decoration: none;}a:hover {text-decoration: underline; color: #FF0000;}--></style><title></title></head><body background="di2001.jpg"><h3 align="center"><font COLOR="#AOAO99">圖形控制技巧</font></h3><table width="100%"> <tr> <td><font color="0000FF"><a name="1">Delphi 3 圖形VCL中Bug修改方案:<br> 傅貴</a></font></td> </tr> <tr> <td> 所有用Delphi 3的TJpegImage開(kāi)發(fā)過(guò)Web ISAPI程序的人都知道:剛開(kāi)始程序運(yùn)行是正<br> 確的,但是運(yùn)行不出幾次,程序就會(huì)出問(wèn)題:Web Server產(chǎn)生頁(yè)面錯(cuò)誤! 但是仔細(xì)檢查自己的程序,發(fā)現(xiàn)還是沒(méi)有問(wèn)題,到底為什么?<br> 經(jīng)仔細(xì)檢查Delphi 3 VCL 的源程序,發(fā)現(xiàn)實(shí)際上錯(cuò)誤發(fā)生在Delphi 3的圖形處理文件<br> Graphics中,Borland公司的開(kāi)發(fā)人員鎖住了BitmapCanvasList但是未解鎖,使得程序在多線程的程序中會(huì)產(chǎn)生錯(cuò)誤。<br> 具體如下:(下面的程序在Delphi 3\Source\VCL\Graphics.pas中) procedure FreeMemoryContexts;<br> var I: Integer; begin with BitmapCanvasList.LockList do begin<br> try for I := Count-1 downto 0 do<br> with TBitmapCanvas(Items[I]) do if TryLock then try<br> FreeContext; finally Unlock; end; finally<br> BitmapCanvasList.UnLockList; end end; end; ...<br> procedure DeselectBitmap(AHandle: HBITMAP); var I: Integer; begin<br> if AHandle = 0 then Exit; with BitmapCanvasList.LockList do try<br> for I := Count - 1 downto 0 do with TBitmapCanvas(Items[I]) do<br> if (FBitmap <> nil) and (FBitmap.FImage.FHandle = AHandle) then<br> FreeContext; finally BitmapCanvasList.UnLockList; end end;<br> 在以上的程序中紅色為補(bǔ)充的程序,桔紅色為發(fā)生錯(cuò)誤的程序。 修改的方法為修改以上的程序,然后編譯生成DCU文件,覆蓋在Lib中的DCU文件,重<br> 新編譯你所有用到圖形的程序。<br> </td> </tr> <tr> <td><font color="0000FF"><a name="2">基于Delphi的圖像漫游<br> 向暉</a></font></td> </tr> <tr> <td>在開(kāi)發(fā)多媒體應(yīng)用中,經(jīng)常會(huì)遇到需要在有限區(qū)域內(nèi)顯示大圖像的情況,有不少文章對(duì)此提出過(guò)解決方法,如通過(guò)調(diào)用Windows的API函數(shù),直接讀寫(xiě)內(nèi)存等。這些方法有某些優(yōu)點(diǎn),但實(shí)現(xiàn)起來(lái)較為復(fù)雜,且易出錯(cuò)。筆者在實(shí)踐中通過(guò)仔細(xì)摸索,利用Delphi的強(qiáng)大的面向?qū)ο罂梢暬_(kāi)發(fā)環(huán)境開(kāi)發(fā)了一種交互式圖像漫游方法。Delphi中,鼠標(biāo)的消息響應(yīng)是通過(guò)元件的OnMouseDown、OnMouseUp和OnMouseMove事件實(shí)現(xiàn)的,通過(guò)對(duì)此三個(gè)事件編程,可控制圖像在有限區(qū)域內(nèi)移動(dòng)??紤]到所移動(dòng)的圖像的邊界應(yīng)總在該區(qū)域外,因此圖像的左上角坐標(biāo)應(yīng)小于該區(qū)域?qū)?yīng)坐標(biāo),圖像右下角坐標(biāo)應(yīng)大于該區(qū)域?qū)?yīng)坐標(biāo)(除非圖像大小比該區(qū)域小)。圖1具體方法是:<br> 1、新建一工程Project1,在Form1中依次放入Panel1、Panel2和Image1元件,注意Pa nel2和Image1分別在Panel1和Panel2上,再將一Label1元件加入Panel2中,調(diào)整Panel1尺寸為適當(dāng)大小,并修改各元件屬性為:<br> 元件<br> 屬性名<br> 屬性值<br> Panel1<br> BevelInner:<br> bvRaised<br> BevelOuter: bvNone<br> BorderStyle: bsSingle<br> Panel2<br> Align:<br> alClient<br> Image1<br> AutoSize:<br> True<br> Picture:<br> "Apple.bmp"<br> Label1<br> Align:<br> alClient<br> Transparent : True<br> 注意:此處Label1的作用不是顯示字符,而是利用它響應(yīng)鼠標(biāo)消息,如果不用Label1而直接利用Image1的鼠標(biāo)事件響應(yīng),則會(huì)由于其OnMouseDown事件的激活與Image1的自身坐標(biāo)移動(dòng)事件沖突而使圖像發(fā)生閃爍甚至不能移動(dòng)。<br> 2、在implementation后加入變量聲明:<br> origin:Tpoint;<br> image_left:integer;<br> image_top:integer;<br> visa1:Tpoint; (鼠標(biāo)當(dāng)前位置相對(duì)圖像右下角的坐標(biāo))<br> visa2:Tpoint; (鼠標(biāo)當(dāng)前位置相對(duì)圖像左上角的坐標(biāo))<br> canmove:boolean;<br> 編寫(xiě)Label1鼠標(biāo)響應(yīng)事件:<br> procedure TForm1.Label1MouseDown(Sender: TObject; Button<br> : TMouseButton;S hift: TShiftState; X, Y: Integer);<br> begin<br> if Button=mbLeft then<br> begin<br> origin.x:=X;<br> origin.y:=Y;<br> image_left:=image1.left;<br> image_top:=image1.top;<br> visa1.x:=X-(image1.width-panel2.width+image1.left);<br> visa1.y:=Y-(image1.height-panel2.height+image1.top);<br> visa2.x:=X-image1.left;<br> visa2.y:=Y-image1.top;<br> canmove:=true;<br> end;<br> end;<br> procedure TForm1.Label1MouseMove(Sender: TObject; Shift:<br> TShiftState; X, Y: Integer);<br> begin<br> if canmove then<br> begin<br> if X<visa1.x then X:="visa1.x;<Br"> if X>visa2.x then X:=visa2.x;<br> if Y<visa1.y then Y:="visa1.y;<Br"> if Y>visa2.y then Y:=visa2.y;<br> image1.left:=image_left+(X-origin.x);<br> image1.top:=image_top+(Y-origin.y);<br> end;<br> end;<br> procedure TForm1.Label1MouseUp(Sender: TObject; Button:<br> TMouseButton;Shi ft: TShiftState; X, Y: Integer);<br> begin<br> canmove:=false;<br> end;<br> 上述程序在Delphi 2.0中編譯通過(guò),經(jīng)過(guò)擴(kuò)充和修改還可應(yīng)用于多媒體數(shù)據(jù)庫(kù)的圖像顯示,對(duì)于開(kāi)發(fā)友好界面有一定借鑒作用。<br> </td> </tr> <tr> <td><font color="0000FF"><a name="3">界面色彩漸變效果的實(shí)現(xiàn)<br> 山東 楊波 </a></font></td> </tr> <tr> <td> 界面色彩漸變效果是通過(guò)用漸變的畫(huà)刷刷繪依次相鄰的矩形塊實(shí)現(xiàn)的。下面列舉實(shí)例說(shuō)明:<br> 1.新建一個(gè)表單,假設(shè)其Width為500,設(shè)置一個(gè)按鈕Button1,按此按鈕將把表單置為由左向右由黃變白的漸變效果。<br> 2.Button1按鈕的代碼如下:<br> procedure TForm1.Button1Click(Sender: TObject);<br> var i,j:Integer;<br> Dct:TRect;<br> begin<br> j:=Form1.height;<br> //獲得表單高度<br> for i:=0 to 255 do<br> //此處設(shè)置RGB()中一個(gè)顏色值<br> begin<br> Canvas.Brush.Color:=RGB(255,255,i);<br> //每次畫(huà)矩形的畫(huà)刷顏色<br> Dct:=Rect(i*2,0,(i+1)*2,j);<br> //每次刷繪的矩形區(qū)域<br> Canvas.FillRect(Dct);<br> //填充顏色<br> end;<br> end;<br> 上例在Windows95,Delphi3.0環(huán)境下運(yùn)行通過(guò)。<br> </td> </tr> <tr> <td><font color="0000FF"><a name="4">圖形整體拉出效果<br> 山東 楊波</a></font></td> </tr> <tr> <td> 單純的圖形整體拉出效果比較簡(jiǎn)單,動(dòng)態(tài)地改變圖形區(qū)域的大小就可以實(shí)現(xiàn),但事先應(yīng)將圖形的“Stretch”設(shè)置為“True”。<br> 舉例說(shuō)明下拉效果:<br> 1.在表單上放置一圖片,高度為200,屬性“Height”設(shè)為0,“Stretch”設(shè)置為T(mén)rue。添加“Timer”構(gòu)件, “Interval”設(shè)為200,“Enable”設(shè)為T(mén)ure。<br> 2.在Timer1Timer中添加代碼:<br> procedure TForm1.Timer1Timer(Sender: TObject);<br> begin<br> Image1.Height:=Image1.Height+20;<br> //設(shè)置增量<br> if image1.Height=200 then Timer1.Enabled:=FALSE;<br> //圖形整體拉出完畢<br> end;<br> 上例在Windows95,Delphi3.0環(huán)境下運(yùn)行通過(guò)。<br> </td> </tr></table><p align="center"> </p></body></html>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -