熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

用Delphi實現位圖顯示特技

2013-11-23 17:46:53  來源: Delphi編程 

  在應用程序中引入位圖並以多種特技顯示會使程序界面生動形象充滿魅力那麼在Delphi環境中如何實現這一切呢?筆者在用Delphi開發一個多媒體系統時發現了實現位圖顯示特技的兩種方法下面將對這兩種方法予以介紹供Delphi愛好者參考


  畫布Tcanvas簡介

  Delphi中與繪圖和位圖操作有關的對象是畫布TcanvasTcanvas對象功能強大封裝了WindowsAPI的GDI用戶可以很方便地在畫布上繪制直線矩形橢圓多邊形等基本圖形還可以顯示拷貝位圖卻不必關心設備上下文等GDI概念極大地方便了用戶Tcanvas對象本身並不是一個構件不單獨使用它總是作為其它對象的屬性來使用的

  Delphi有四個對象具有畫布屬性它們是TFormTImageTPaintbox和Tbitmap其中前三者是可視化構件至於Tcanvas的詳細情況可以參考Delphi的聯機幫助

  實現簡單的位圖顯示特技實際上就是以不同的方式逐漸將源位圖拷貝到Tcanvas類型的對象上如從位圖的中央開始拷貝一個矩形區域到屏幕中央矩形區域不斷擴大直到拷貝整個位圖其視覺效果就是位圖從屏幕中央向四周擴散不同的拷貝方式就形成了多種特技形式如擴散拉動和百葉窗等對於每種特技形式靈活運用又可演變出多種花樣如擴散可以演變為從上向下從左向右從中間向四周和相反方向的擴散以及從一角向對角方向擴散的特技花樣

  實現上述位圖顯示特技的原理很簡單關鍵是怎樣實現位圖的拷貝在Delphi中有兩種拷貝位圖的方法相應地就有兩種實現位圖顯示特技的方法一種是用Tcanvas對象的方法CopyRect另一種是調用WindowsAPI的BitBlt函數下面就以兩種特技的實現為例分別介紹這兩種方法


  方法之一調用CopyRect

  Tcanvas對象與拷貝位圖有關的是CopyMode屬性和CopyRect方法其中CopyMode定義拷貝的模式而Copy Rect執行位圖拷貝的操作當CopyMode定義為缺省值cmSrcCopy時CopyRect將源畫布上的一部分位圖拷貝到目標畫布上的一個矩形區域內CopyRect的過程聲明及參數意義如下

  procedureCopyRect(DestTRectCanvasTCanva
sSourceTRect)

  Dest目標畫布上的矩形區域

  Canvas源畫布

  Source源畫布上的矩形區域

  下面以一個拉動特技的實現為例說明如何用CopyRect方法實現特技該例包括三個構件TformTeditl和Tbuttonl變量step控制拉動的步驟程序運行後從Teditl中輸入待顯示位圖文件名然後單擊Tbuttonl這時位圖從左側出現並逐漸向右側移動好似位圖被從左向右拉動一樣拉動結束後位圖左上角坐標為(xy該例程序清單如下所示

  procedureTForml.ButtonlClick(SenderTObject

  conststepΚ

  xΚ

  yΚ

  varbitmaptbitmap

  midxinteger{中間變量當前步驟所拷貝位圖
的寬}

  ratioxreal{每步位圖寬度增加量}

  iinteger

  rectrecttrect{源目標矩形區域}

  begin

  bitmapΚtbitmap.create

  bitmap.loadfromfile(edit.text)

  ratioxΚbitmap.width/step

  foriΚotostepdo

  begin

  midxΚround(ratiox*i)

  withrectdo

  begin

  leftΚbitmap.width-midx

  topΚ

  rightΚbitmap.width

  bottomΚbitmap.height

  end

  withrectdo

  begin

  leftΚx

  topΚy

  rightΚx+midx

  bottomΚyo+bitmap.height

  end

  canvas.copyrect(rectbitmap.canvasrect

  end

  bitmap.free

  end


  方法之二調用BitBlt函數

  這裡涉及到了在Delphi中如何調用WindowsAPI每當生成一個新的項目時Delphi自動地把WinType和WinProcs單元名添加到所生成單元文件中的uses子句中這兩個單元包含了Delphi調用WindowsAPI所必須的類型定義和例程聲明這樣只需使用正確的參數就可以直接調用WindowsAPI而不需要再作其它任何聲明

  BitBlt及類似的StretchBlt函數是Windows功能強大的圖形處理函數它的功能與TCanvas的CopyRect函數一樣不僅能夠將位圖或位圖的一部分從一處拷貝到另一處它還可以根據個不同的光柵操作碼將三幅位圖結合起來從而呈現不同的視覺效果在WindowsAPI函數中所有的blt函數的鼻祖都是BitBlt函數在Delphi中BitBlt函數聲明及參數意義如下

  functionBitBlt(DestDCHDCXYnWidthHei
ghtIntegerSrcDCHDCXSrcYSRCIngegerRop
LongInt)Bool

  DestDC源設備上下文句柄

  XY源矩形左上角坐標

  nWidthHeight目標矩形的寬度和高度

  SrcDC目標矩形句柄

  XSrcTSrc源位圖矩形左上角坐標

  Rop光柵操作碼對於簡單的拷貝其值為SRCCOPY

  下面同樣以一個例子來說明如何用BitBlt實現特技本例所實現的特技是將選定的位圖從屏幕中心開始向四周擴散最後整個位圖全部顯示出來此例的程序清單如下

  procedureTFormButtonClick(SenderTObject

  conststepΚ

  var

  bitmaptbitmap

  xyinteger{屏幕中心坐標}

  midxmidyinteger

  ratioxratioyteal

  iinteger

  begin

  bitmapΚtbitmap.create

  bitmap.loadfromfile(edit.text)

  xΚround(form.width/

  yΚround(form.height/

  ratioxΚbitmap.width/step

  ratioyΚbitmap.height/step

  foriΚtostepdo

  begin

  midxΚround(ratiox*i)

  midyΚround(ratioy*i)

  bitblt(form.canvas.handlex-midxy-m
idyround(ratiox*i*round(ratioy*i*
bitmap.canvas.handlex-midyy-midysrc
copy)

  end

  bitmap.free

  end.


From:http://tw.wingwit.com/Article/program/Delphi/201311/25071.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.