PEMROGRAMAN API [SubClassing]
SubClassing
•
Cara memanggil window procedure yang lama adalah
dengan jalan memanggil fungsi API CallWindowProc
Declare Function CallWindowProc Lib
"user32" Alias "CallWindowProcA"
( ByVal lpPrevWndFunc As Long,
ByVal
hWnd As Long,
ByVal
Msg As Long,
ByVal
wParam As Long,
ByVal
lParam As Long
) As Long
•
Parameter pertama adalah alamat dari old
procedure
•
Sisanya adalah sama dengan empat parameter yang
kita terima
•
Kita mungkin menginginkan untuk mengubah
beberapa value untuk mengontrol proses message
•
Misalnya ketika kita menerima WM_MOUSEMOVE, kita
mendapatkan koordinat dari mouse melalui IParam dan menggantinya dengan nilai
baru.
•
Return value yang kita tentukan juga
berpengaruh.
•
Tergantung pada message yang dikirimkan
•
Penting untuk mengembalikan window procedure
lama sebelum exit program
•
Dengan jalan menulis kode berikut di Form.Unload
Ret&
= SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress)
•
Bila terlupa, VB akan crash
•
Berikut ini adalah contoh penerapan subclassing
•
Dalam module
Public Const GWL_WNDPROC = -4
Public Declare Function
SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal
Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function
CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal
lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As
Long, ByVal lParam As Long) As Long
Public oldWndProc As Long
Public Function MyWndProc(ByVal
Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
As Long
Debug.Print wMsg & " " & wParam & " "
& lParam
MyWndProc = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam)
End Function
•
Dalam Form
Private Sub Form_Load()
oldWndProc
= SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)
End Sub
Private Sub Form_Unload(Cancel As
Integer)
Ret&
= SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)
End Sub
•
Subclassing tadi akan menampilkan semua message
yang dikirimkan ke window di “Immidiate Window” dlm VB
•
Message dikirimkan pada setiap kali mouse masuk
ke dalam form
Handling Parameters
•
Kadang function tidak mereturn informasi yang
anda butuhkan
•
Contohnya adalah menambahkan 2 buah integer (2
byte) yang melambangkan posisi mouse ke dalam sebuah 4-byte value
•
Kasus yang lain memberitahukan kepada anda jika
bit 29 terdapat, maka terjadi sesuatu
•
Juga, anda mungkin menerima Long value yang
merupakan alamat dari sebuah structure
•
Untuk mengecek apakah bit N dari Value dalam
keadaan on adalah dengan menggunakan kode berikut:
If
Value and (2^N) then ..
•
Kode untuk mengeset bit on adalah:
Value = Value Or 2^N
•
Kode untuk mengeset bit off adalah:
Value = Value And Not 2^N
•
Jika anda mengeset dan mengambil state dari
sebuah bit sebelumnya, lebih cepat dengan jalan mengubah 2^10 dengan 1024
•
Hal ini karena VB tidak perlu menghitungnya
sendiri
•
Jika anda menerima pointer sebagai type, maka
anda harus melakukan hal yang lain
•
Untuk mendapatkan info, gunakan CopyMem.
•
Berikut ini adalah deklarasinya
Declare Sub CopyMem Lib
"kernel32" Alias
"RtlMoveMemory"
( pDest As Any,
pSource
As Any,
ByVal
ByteLen As Long
)
•
Bila anda
menerima pointer ke RECT type dalam Long variabel addr, gunakan kode berikut:
Dim
Info As Rect
Call CopyMem(Info, ByVal Addr, Len(Info))
Call CopyMem(Info, ByVal Addr, Len(Info))
•
Perhatikan keyword ByVal
•
Bila anda ingin mengembalikan informasi tadi,
gunakan kode berikut:
Call
CopyMem(ByVal Addr, Info, Len(Info))
No comments:
Post a Comment
silahkan membaca dan berkomentar