作為一個 程序員 ,在 開發(fā) 程序的時候,都希望自己程序的界面美觀一些,與眾不同一些,有自己鮮明的特色,這需要美化自己的界面,
Delphi編程實現(xiàn)3D圖形修飾技術.net
。一般的方法是用圖形工具制作一個圖形界面,再經過簡單的編程便可獲得一個理想的效果,很多能夠界面換膚的程序大多也基于這種作為一個程序員,在開發(fā)程序的時候,都希望自己程序的界面美觀一些,與眾不同一些,有自己鮮明的特色,這需要美化自己的界面。一般的方法是用圖形工具制作一個圖形界面,再經過簡單的編程便可獲得一個理想的效果,很多能夠界面換膚的程序大多也基于這種思想;但程序員一般不精通圖形制作工具,請外面的美工來做也不方便,其實對一般的3D效果,我們自己也可用程序做。
編程方式實現(xiàn)3D效果的方法
為了改變電腦早期時候的文字界面的單一狀況,各大軟件公司都作出了不懈努力,先后推出了作為圖形處理工業(yè)標準的OpenGL和微軟研發(fā)的Direct3D,至于一些公司自用的3D技術更是不計其數。但本文提出的方法不需要上面大公司的技術,純粹用Delphi的基本函數來實現(xiàn)比較逼真的3D效果。
我以前作過一個卡拉OK電腦點歌程序,點歌方式有多種,其中有一種傳統(tǒng)的點歌方式叫編碼點歌,它需要在屏幕上畫一個點歌鍵盤,用鼠標點擊鍵盤(觸摸屏時用手觸摸)輸入歌曲編碼,其界面如下圖所示:
javascript.:if(this.width>498)this.style.width=498;' nmousewheel = 'javascript.:return big(this)' height=192 alt="" src="/files/uploadimg/20061008/1127350.jpg" width=253 border=0>
上圖中除了迎客松的圖片外,其它如背景、銅柱邊框、3D鍵盤等都是由程序實現(xiàn)的,下面我對實現(xiàn)程序予以簡單說明,上圖界面的完整實現(xiàn)請看本文附帶的源程序。
在給出程序之前先說一下技術思想,Delphi中有些對象具有畫布屬性Canvas,它本身也是一個對象,它具有很多屬性和方法,這里只列出本文用到的幾個。
<PRE></p><p> Canvas.Brush.Style.:=bsClear;//設置畫刷風格</p><p> Canvas.pen.color:=rgb(R,G,B);// 設置畫筆顏色</p><p> Canvas.pen.style.:=psSolid;// 設置畫筆風格</p><p> Canvas.pen.width:=1;//設置畫筆寬度</p><p> procedure MoveTo(X, Y: Integer);</p><p> //將畫筆移到坐標(X, Y) 處作為畫畫的起點</p><p> procedure LineTo(X, Y: Integer);</p><p> //從當前位置畫一條直線到坐標(X, Y) 處</p><p> procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer);</p><p> //根據給定的參數畫一個圓角矩形,X3、Y3用于確定圓角大小</p></PRE>
下面給出3D效果制作子程序:
1、背景制作子程序
本段程序是用來畫背景,只要給出不同的顏色RGB值就能畫出不同的背景。下面的子程序都是利用對象的畫布Canvas并按一定的算法來生成效果。
<PRE></p><p> procedure draw_bk(Sender:TForm;R,G,B:integer);</p><p> var i,j,k:integer;</p><p> begin</p><p> with Sender do</p><p> begin</p><p> canvas.pen.style.:=psSolid;</p><p> canvas.pen.width:=1;</p><p> k:=(B div 3)*2;</p><p> for i:=0 to 480 do</p><p> begin</p><p> if i<k then j:=0 else j:=j+1;</p><p> if j>B then j:=B;</p><p> Canvas.pen.color:=rgb(R,G,B-j);</p><p> canvas.moveTo(0,i);</p><p> canvas.lineTo(640,i);</p><p> end;</p><p> end;</p><p> end;</p></PRE>
2、邊框周圍銅柱子程序
本段程序是用來畫窗口周圍的銅柱,只要給出不同的顏色RGB值就能畫出不同顏色的柱子。
<PRE></p><p> procedure draw_roll(Sender:TForm;X0,Y0,W,H,R,G,B,lw:integer);</p><p> var i,J,j1,J2,J3,m,X,Y:integer;</p><p> begin</p><p> J1:=R div lw-2;</p><p> J2:=G div lw;</p><p> J3:=B div lw+2;</p><p> m:=lw div 3;</p><p> with Sender do</p><p> begin</p><p> for i:=0 to lw do</p><p> begin</p><p> if i<m then j:=m-i else j:=i-m;</p><p> Canvas.pen.color:=rgb(R-J1*J,G-J2*J,B-J3*J);</p><p> canvas.moveTo(i+X0,i+Y0);</p><p> canvas.lineTo(i+X0,H-i+Y0);</p><p> Canvas.pen.color:=rgb(R-J1*J,G-J2*J,B-J3*J);</p><p> canvas.moveTo(W-i-1+X0,i+Y0);</p><p> canvas.lineTo(W-i-1+X0,H-i+Y0);</p><p> Canvas.pen.color:=rgb(R-J1*J,G-J2*J,B-J3*J);</p><p> canvas.moveTo(i+X0,i+Y0);</p><p> canvas.lineTo(W-i+X0,i+Y0);</p><p> Canvas.pen.color:=rgb(R-J1*J,G-J2*J,B-J3*J);</p><p> canvas.moveTo(i+X0,H-i+Y0);</p><p> canvas.lineTo(W-i+X0,H-i+Y0);</p><p> end;</p><p> end;</p><p> end;</p></PRE>
3、中間銅柱子程序
本段程序是用來畫窗口中間的銅柱,只要給出不同的顏色RGB值就能畫出不同顏色的柱子。
<PRE></p><p> procedure draw_sroll(Sender:TForm;X0,Y0,W,H,R,G,B,lw:integer);</p><p> var i,J,j1,J2,J3,m,X,Y,i1,i2:integer;</p><p> begin</p><p> J1:=R div lw-2;</p><p> J2:=G div lw;</p><p> J3:=B div lw+2;</p><p> m:=lw div 3;</p><p> with Sender do</p><p> begin</p><p> for i:=0 to lw do</p><p> begin</p><p> i1:=i;</p><p> i2:=i;</p><p> if h=0 then i1:=0;</p><p> if w=0 then i2:=0;</p><p> if i<m then j:=m-i else j:=i-m;</p><p> Canvas.pen.color:=rgb(R-J1*J,G-J2*J,BJ3*J);</p><p> canvas.moveTo(i1+X0,i2+Y0);</p><p> canvas.lineTo(i1+W+X0,i2+H+Y0);</p><p> end;</p><p> end;</p><p> end;</p></PRE>
4、3D框制作子程序
本段程序是用來畫控件周圍的邊框,使該控件看起來有立體感,只要給出不同的顏色RGB值就能畫出不同顏色的邊框,ww是立體景深,
電腦資料
《Delphi編程實現(xiàn)3D圖形修飾技術.net》(http://m.clearvueentertainment.com)。<PRE></p><p> procedure draw_rect(Sender:TForm;X0,Y0,W,H,R,G,B,lw,ww,fg:integer);</p><p> var ii,i,J,j1,J2,J3,m:integer;</p><p> begin</p><p> J1:=R div lw-2;</p><p> J2:=G div lw;</p><p> J3:=B div lw+2;</p><p> m:=lw div 3;</p><p> if fg=1 then{fg=0 ê.°.}</p><p> begin</p><p> j1:=j1 div 2+(j1+2) div 3;</p><p> j2:=j2 div 2+(j2+2) div 3;</p><p> j3:=j3 div 2+(j3+2) div 3;</p><p> end;</p><p> with Sender do</p><p> begin</p><p> Canvas.Brush.Style.:=bsClear;</p><p> for ii:=0 to lw do</p><p> begin</p><p> if fg=0 then</p><p> begin</p><p> i:=ii;</p><p> if i<m then j:=m-i else j:=i-m;</p><p> end</p><p> else i:=lw-ii;</p><p> j:=ii;</p><p> Canvas.pen.color:=rgb(R-J1*J,G-J2*J,B-J3*J);</p><p> canvas.RoundRect(i+X0-lw,i+Y0-lw,X0+W-i+lw, H+Y0-i+lw,ww,ww);</p><p> end;</p><p> end;</p><p> end;</p></PRE>
利用以上子程序就可實現(xiàn)一些3D效果,實現(xiàn)的算法就是利用循環(huán)語句作畫,至于語句為什么要這樣寫,這是我通過多次試驗調試出來的,正因為如此該算法不可能很完善,您可以對此改進作出更完美的效果。
最后,利用上面提供的子程序就可完成上圖所示的界面編制,其程序代碼如下:
<PRE></p><p> procedure TForm2.FormPaint(Sender: TObject);</p><p> begin</p><p> draw_bk(Form2,60,60,255);//畫藍色漸變背景</p><p> draw_roll(Form2,0,0,640,480,250,200,100,10);</p><p> //畫邊框周圍銅柱</p><p> with Image1 do draw_rect(Form2,left,top,width,height, 250,200,100,10,1,1); //畫圖片框</p><p> with Panel1 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel2 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel3 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel4 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel5 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel6 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel7 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel8 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel9 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel10 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel11 do draw_rect(Form2,left,top,width, height*2+2,250,238,238,10,1,1);</p><p> with Panel13 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel14 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel16 do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> //以上畫鍵盤</p><p> with sele_fun do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with Panel15 do draw_rect(Form2,left,top,222,height, 250,238,238,10,1,1);</p><p> with Panel15 do draw_rect(Form2,left-11,top-11,242, 350,250,258,238,10,1,1);</p><p> draw_sroll(Form2,291,5,0,470,250,200,100,12);</p><p> with gd do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> with gk do draw_rect(Form2,left,top,width,height, 250,238,238,10,1,1);</p><p> end;</p></PRE>
本文帶有源程序,該程序在Delphi 6.0下調試通過,無需擴展控件支持,純軟件方式實現(xiàn),在界面設計上具有很大的靈活性,與圖片界面相比有其方便性,并且制作出來的界面有自己鮮明的特色。
結束語
本文闡述了不借助OpenGL和Direct3D圖形庫自己編程實現(xiàn)3D效果的方法,給出了實現(xiàn)一個鍵盤界面的完整源代碼。在工作中究竟使用什么來實現(xiàn)3D和其它效果,要看工作性質而定,例如開發(fā)圖形效果表現(xiàn)豐富的游戲軟件,就要用到OpenGL或Direct3D技術,至于一些行業(yè)應用和工具軟件一般使用手工編程改善一下界面效果即可,就像上面的代碼,將比使用圖形庫的程序大大節(jié)省資源,而且易維護、易管理、兼容性也好。
(責任編輯 火鳳凰 sunsj@51cto.com TEL:(010)68476636-8007)
原文轉自:http://www.ltesting.net