Translate

Tuesday, August 23, 2016

PEMROGRAMAN API [SubClassing]



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))
               
          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