透明貼圖的方法解說

  當大家功力到達一程度的時候,相信大家會想試試用VB寫Game的味道,您們可能厭倦了龜速的PaintPicture貼圖速度、遲鈍的Key_Press事件、無數的PictureBox陣列和不準時的Timer物件……站長也是過來人,明白用這些東東寫遊戲會令遊戲的質素大大下降,因此站長教您一些好康的方法!

用DC取代PictureBox:

  甚麼是DC?簡單點說,它是貼圖區的記憶體,或者是記憶體裡的PictureBox,首先我們要用CreateCompatibleDC建立,宣告法是:

Declare Function CreateCompatibleDC Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hdc As Long) As Long

同時我們需要一個Long形態的變數來記錄該DC的位置,因此要宣告:

Dim XXX As Long

XXX = CreateCompatibleDC(0)

建立了DC後,我們要為這DC加入影像,因此我們要建立一個Bitmap,這裡站長教大家宣告一個新的形態:

Dim BMP As Picture

Set BMP = LoadPicture("X:\XX.BMP")

建立好Bitmap後,我們要用一個API函數使DC和Bitmap建立關聯,這樣Bitmap的圖像就會在DC裡出現了!

Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long

SelectObject XXX, BMP

Set BMP = Nothing '用完即棄

這樣,完整的DC就可以隨時使用了!

利用BitBlt貼圖:

要將DC的圖像轉移,我們一定要用BitBlt這API函數,其宣告法是:

Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

用法:

BitBlt 目的地.hDC, 貼在目的地的X位置, 貼在目的地的Y位置, 貼在目的地的寬度, 貼在目的地的高度, 來源DC, 從那裡開始的X位置, 從那裡開始的Y位置, 貼圖方法

例子:

BitBlt Me.hDC, 0, 0, 640, 480, XXX, 0, 0, vbSrcCopy

透明貼圖:

在進行透明貼圖之前,我們需要準備一幅原圖和一幅遮罩圖。

甚麼是遮罩圖?

以下是原圖和遮罩圖的例子:

<~~原圖

<~~遮罩圖

遮罩圖是要將不要透明的部份變黑色,要透明的部份轉白色,以下就要開始透明貼圖了:

Option Explicit

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Dim 原圖DC As Long
Dim 遮罩圖DC As Long

Private Sub Form_Load()
Dim BMP As Picture
 原圖DC = CreateCompatibleDC(0)
 Set BMP = LoadPicture("X:\原圖檔路徑.BMP")
 SelectObject 原圖DC, BMP

 遮罩圖DC = CreateCompatibleDC(0)
 Set BMP = LoadPicture("X:\遮罩圖檔路徑.BMP")
 SelectObject 遮罩圖DC, BMP
End Sub

Private Sub Command1_Click()
Dim i As Byte
 For i = 1 To 2
  BitBlt Me.hdc, 0, 0, 40, 40, 遮罩圖DC, 0, 0, vbSrcAnd
  BitBlt Me.hdc, 0, 0, 40, 40, 原圖DC, 0, 0, vbSrcInvert
 Next i
End Sub

Private Sub Form_Unload(Cancel As Integer)
 DeleteDC 原圖DC
 DeleteDC 遮罩圖DC
End Sub

DeleteDC:

一般貼圖之後,我們要將用完的貼圖記憶體DC洗掉,因此要用到DeleteDC,其宣告法是:

Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

用法:

DeleteDC 某某DC


上一頁