Callback dan Message dalam windows

Dalam pemrograman dengan <windows.s>, kita menggunakan loop yang berisi GetMessage, TranslateMessage dan DispatchMessage untuk mulai menampilkan windows dan mengetahui apa yang sudah pengguna lakukan terhadap program kita. Walaupun tiga function tersebut cukup penting, tidak perlu memusingkan kegunaan tiga function tersebut, yang terpenting untuk saat ini adalah kita bisa membuat program sesuai keinginan kita.

Selain itu, ada function yang disebut callback. Callback bisa digunakan untuk menerima dan menangani event-event yang terjadi pada windows. Event-event tersebut dikirim dalam bentuk message / pesan pada function yang menjadi "callback" dari window yang kita tampilkan. Event-event tersebut dikirim sebagai pesan dengan nilai tertentu. Dalam "windows.h" pesan-pesan tersebut didefinisikan dengan awalan "WM_".

LRESULT CALLBACK wndproc(HWND hwnd, UINT pesan, WPARAM wParam, LPARAM lParam){
switch(pesan){
case WM_CLOSE:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, pesan, wParam, lParam);
};


Dalam contoh sebelumnya, pesan yang kita gunakan hanya WM_CLOSE. WM_CLOSE diaktifkan saat windows akan ditutup. Selain WM_CLOSE, sebenarnya masih ada pesan untuk event-event lain yang bisa kita gunakan. Yang jelas, selain hanya menampilkan windows kosong, banyak hal lain yang bisa kita lakukan dengan tampilan window yang telah kita buat.

#include <windows.h>

LRESULT CALLBACK wndproc(
  HWND   hwnd, UINT   pesan,
  WPARAM wParam, LPARAM lParam
);

int __stdcall WinMain(HINSTANCE hinst, HINSTANCE hprev, char *cmdl, int cmds){
HWND wind;
MSG msg;
WNDCLASS wcls={0};
wcls.hInstance=hinst;
wcls.hbrBackground=GetSysColorBrush(COLOR_3DFACE);
wcls.lpszClassName=TEXT("windowku");
wcls.lpfnWndProc=wndproc;
wcls.hCursor=LoadCursor(0,IDC_ARROW);
RegisterClass(&wcls);

wind=CreateWindowEx(0, TEXT("windowku"), "Programku", WS_VISIBLE|WS_OVERLAPPEDWINDOW, 400, 200, 400, 400, 0, 0, hinst, 0);
while(GetMessage(&msg, NULL, 0, 0)){
DispatchMessage(&msg);
TranslateMessage(&msg);
    }
return msg.wParam;
}

LRESULT CALLBACK wndproc(HWND hwnd, UINT pesan, WPARAM wParam, LPARAM lParam){
switch(pesan){
case WM_LBUTTONDOWN:
MessageBox(hwnd, "Halo", "Klik kiri",0);
break;
case WM_RBUTTONDOWN:
MessageBox(hwnd, "Halo", "Klik Kanan",0);
break;
case WM_CLOSE:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, pesan, wParam, lParam);
};

Di atas, kita menambahkan WM_LBUTTONDOWN dan WM_RBUTTONDOWN sebagai case dalam switch dari parameter pesan. WM_LBUTTONDOWN aktif saat tombol kiri mouse ditekan. Sebaliknya WM_RBUTTONDOWN aktif saat tombol kanan mouse ditekan. Sekarang coba letakkan pointer / kursor mouse di windows dan klik tombolnya!


Berikut ini adalah beberapa message atau pesan yang sering digunakan terkait event yang ada pada window!
  1. WM_CREATE : Saat window baru dibuat.
  2. WM_CLOSE : Saat window akan ditutup.
  3. WM_DESTROY : Saat window sudah ditutup dan "dihancurkan".
  4. WM_LBUTTONDOWN : Saat tombol mouse kiri ditekan.
  5. WM_MBUTTONDOWN :  Saat tombol mouse tengah ditekan.
  6. WM_RBUTTONDOWN : Saat tombol mouse kanan ditekan.
  7. WM_LBUTTONUP : Saat tombol mouse kiri ditekan.
  8. WM_MBUTTONUP : Saat tombol mouse tengah dilepas.
  9. WM_RBUTTONUP : Saat tombol mouse kanan dilepas.
  10. WM_MOUSEWHEEL : Saat "bagian tengah" mouse "di-scroll".
  11. WM_KEYDOWN : Saat tombo keyboard ditekan.
  12. WM_KEYUP : Saat tombol keyboard dilepas.
  13. WM_COMMAND : Saat tombol dalam tampilan windows ditekan atau bisa juga berisi pesan lain dari window.
  14. WM_MENUCOMMAND : Saat menu dipilih
  15. WM_PAINT : Saat window "digambar" oleh sistem atau aplikasi lain.
Message untuk event lain bisa dilihat di dokumentasi dari microsoft tentang "windows.h". Untuk mendapatkan tombol keyboard yang ditekan atau koordinat dari kursor mouse, kita bisa menggunakan lparam. Tapi, untuk saat ini, sampai di sini dulu saja.