Menanggapi Klik Mouse
Jika pengguna mengklik tombol mouse saat kursor berada di atas area klien jendela, jendela akan menerima salah satu pesan berikut.
Pesan | Makna |
---|---|
WM_LBUTTONDOWN | Tombol kiri ke bawah |
WM_LBUTTONUP | Tombol kiri ke atas |
WM_MBUTTONDOWN | Tombol tengah ke bawah |
WM_MBUTTONUP | Tombol tengah ke atas |
WM_RBUTTONDOWN | Tombol kanan ke bawah |
WM_RBUTTONUP | Tombol kanan atas |
WM_XBUTTONDOWN | XBUTTON1 atau XBUTTON2 |
WM_XBUTTONUP | XBUTTON1 atau XBUTTON2 |
Ingat bahwa area klien adalah bagian dari jendela yang mengecualikan bingkai. Untuk informasi selengkapnya tentang area klien, lihat Apa itu Jendela?
Koordinat Mouse
Dalam semua pesan ini, parameter lParam berisi koordinat x dan y dari penunjuk mouse. 16 bit terendah lParam berisi koordinat x, dan 16 bit berikutnya berisi koordinat y. Gunakan makro GET_X_LPARAM dan GET_Y_LPARAM untuk membuka kemasan koordinat dari lParam.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
Makro ini didefinisikan dalam file header WindowsX.h.
Pada Windows 64-bit, lParam adalah nilai 64-bit. 32 bit atas lParam tidak digunakan. Di mana dokumentasi Windows menyebutkan "kata urutan rendah" dan "kata urutan tinggi" lParam, kasus 64-bit berarti kata-kata dengan urutan rendah dan tinggi dari 32 bit yang lebih rendah. Makro mengekstrak nilai yang tepat, jadi jika Anda menggunakannya, Anda akan aman.
Koordinat mouse diberikan dalam piksel, bukan piksel independen perangkat (DIP), dan diukur relatif terhadap area klien jendela. Koordinat adalah nilai yang ditandatangani. Posisi di atas dan di sebelah kiri area klien memiliki koordinat negatif, yang penting jika Anda melacak posisi mouse di luar jendela. Kita akan melihat cara melakukannya dalam topik selanjutnya, Menangkap Gerakan Mouse di Luar Jendela.
Bendera Tambahan
Parameter wParam berisi bitwise ATAU bendera, menunjukkan status tombol mouse lainnya ditambah tombol SHIFT dan CTRL.
Bendera | Makna |
---|---|
MK_CONTROL | Tombol CTRL tidak berfungsi. |
MK_LBUTTON | Tombol mouse kiri tidak berfungsi. |
MK_MBUTTON | Tombol mouse tengah tidak berfungsi. |
MK_RBUTTON | Tombol kanan mouse tidak berfungsi. |
MK_SHIFT | Tombol SHIFT tidak berfungsi. |
MK_XBUTTON1 | Tombol XBUTTON1 tidak berfungsi. |
MK_XBUTTON2 | Tombol XBUTTON2 tidak berfungsi. |
Tidak adanya bendera berarti tombol atau tombol yang sesuai tidak ditekan. Misalnya, untuk menguji apakah tombol CTRL tidak berfungsi:
if (wParam & MK_CONTROL) { ...
Jika Anda perlu menemukan status tombol lain selain CTRL dan SHIFT, gunakan fungsi GetKeyState, yang dijelaskan dalam Input Keyboard.
Pesan jendela WM_XBUTTONDOWN dan WM_XBUTTONUP berlaku untuk XBUTTON1 dan XBUTTON2. Parameter wParam menunjukkan tombol mana yang diklik.
UINT button = GET_XBUTTON_WPARAM(wParam);
if (button == XBUTTON1)
{
// XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
// XBUTTON2 was clicked.
}
Klik Ganda
Jendela tidak menerima pemberitahuan klik ganda secara default. Untuk menerima klik ganda, atur bendera CS_DBLCLKS di struktur WNDCLASS saat Anda mendaftarkan kelas jendela.
WNDCLASS wc = { };
wc.style = CS_DBLCLKS;
/* Set other structure members. */
RegisterClass(&wc);
Jika Anda mengatur bendera CS_DBLCLKS seperti yang ditunjukkan, jendela akan menerima pemberitahuan klik ganda. Klik ganda ditunjukkan oleh pesan jendela dengan "DBLCLK" dalam nama. Misalnya, klik dua kali pada tombol mouse kiri menghasilkan urutan pesan berikut:
Akibatnya, pesan WM_LBUTTONDOWN kedua yang biasanya akan dihasilkan menjadi pesan WM_LBUTTONDBLCLK. Pesan yang setara didefinisikan untuk tombol kanan, tengah, dan XBUTTON.
Hingga Anda mendapatkan pesan klik ganda, tidak ada cara untuk memberi tahu bahwa klik mouse pertama adalah awal dari klik ganda. Oleh karena itu, tindakan klik ganda harus melanjutkan tindakan yang dimulai dengan klik mouse pertama. Misalnya, di Windows Shell, satu klik memilih folder, sementara klik ganda membuka folder.
Pesan Mouse non-klien
Sekumpulan pesan terpisah didefinisikan untuk peristiwa mouse yang terjadi di dalam area non-klien jendela. Pesan-pesan ini memiliki huruf "NC" dalam nama. Misalnya, WM_NCLBUTTONDOWN setara dengan WM_LBUTTONDOWN non-klien. Aplikasi umum tidak akan mencegat pesan-pesan ini , karena fungsi DefWindowProc menangani pesan-pesan ini dengan benar. Namun, fungsi tersebut dapat berguna untuk fungsi lanjutan tertentu. Misalnya, Anda dapat menggunakan pesan ini untuk menerapkan perilaku kustom di bilah judul. Jika Anda menangani pesan-pesan ini, Anda umumnya harus meneruskannya ke DefWindowProc setelahnya. Jika tidak, aplikasi Anda akan merusak fungsionalitas standar seperti menyeret atau meminimalkan jendela.
Berikutnya