Delphi編程實現(xiàn)3D圖形修飾技術.net -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【m.clearvueentertainment.com - 電腦資料】

    作為一個 程序員 ,在 開發(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

最新文章