Gambaran Umum Input Mouse

Mouse adalah perangkat input pengguna yang penting, tetapi opsional untuk aplikasi. Aplikasi yang ditulis dengan baik harus menyertakan antarmuka mouse, tetapi tidak boleh hanya bergantung pada mouse untuk memperoleh input pengguna. Aplikasi juga harus memberikan dukungan keyboard penuh.

Aplikasi menerima input mouse dalam bentuk pesan yang dikirim atau diposting ke jendelanya.

Bagian ini membahas topik-topik berikut:

Kursor Mouse

Ketika pengguna memindahkan mouse, sistem memindahkan bitmap pada layar yang disebut kursor mouse. Kursor mouse berisi titik piksel tunggal yang disebut titik panas, titik yang dilacak dan dikenali sistem sebagai posisi kursor. Ketika peristiwa mouse terjadi, jendela yang berisi hot spot biasanya menerima pesan mouse yang dihasilkan dari peristiwa tersebut. Jendela tidak perlu aktif atau memiliki fokus keyboard untuk menerima pesan mouse.

Sistem mempertahankan variabel yang mengontrol kecepatan mouse—yaitu, jarak kursor bergerak saat pengguna memindahkan mouse. Anda dapat menggunakan fungsi SystemParametersInfo dengan bendera SPI_GETMOUSE atau SPI_SETMOUSE untuk mengambil atau mengatur kecepatan mouse. Untuk informasi selengkapnya tentang kursor mouse, lihat Kursor.

Tangkapan Mouse

Sistem biasanya memposting pesan mouse ke jendela yang berisi hot spot kursor saat peristiwa mouse terjadi. Aplikasi dapat mengubah perilaku ini dengan menggunakan fungsi SetCapture untuk merutekan pesan mouse ke jendela tertentu. Jendela menerima semua pesan mouse hingga aplikasi memanggil fungsi ReleaseCapture atau menentukan jendela pengambilan lain, atau sampai pengguna mengklik jendela yang dibuat oleh utas lain.

Ketika tangkapan mouse berubah, sistem mengirim pesan WM_CAPTURECHANGED ke jendela yang kehilangan tangkapan mouse. Parameter lParam pesan menentukan handel ke jendela yang mendapatkan tangkapan mouse.

Hanya jendela latar depan yang dapat mengambil input mouse. Ketika jendela latar belakang mencoba mengambil input mouse, jendela menerima pesan hanya untuk peristiwa mouse yang terjadi ketika hot spot kursor berada di dalam bagian jendela yang terlihat.

Menangkap input mouse berguna jika jendela harus menerima semua input mouse, bahkan ketika kursor bergerak ke luar jendela. Misalnya, aplikasi biasanya melacak posisi kursor setelah peristiwa tombol mouse turun, mengikuti kursor hingga terjadi peristiwa tombol mouse ke atas. Jika aplikasi belum mengambil input mouse dan pengguna melepaskan tombol mouse di luar jendela, jendela tidak menerima pesan tombol-up.

Utas dapat menggunakan fungsi GetCapture untuk menentukan apakah salah satu jendelanya telah menangkap mouse. Jika salah satu jendela utas telah menangkap mouse, GetCapture mengambil handel ke jendela.

Mouse ClickLock

Fitur aksesibilitas ClickLock Mouse memungkinkan pengguna mengunci tombol mouse utama setelah satu klik. Untuk aplikasi, tombol masih tampak ditekan. Untuk membuka kunci tombol, aplikasi dapat mengirim pesan mouse apa pun atau pengguna dapat mengklik tombol mouse apa pun. Fitur ini memungkinkan pengguna melakukan kombinasi mouse yang kompleks dengan lebih sederhana. Misalnya, mereka yang memiliki batasan fisik tertentu dapat menyorot teks, menyeret objek, atau membuka menu dengan lebih mudah. Untuk informasi selengkapnya, lihat bendera berikut dan Komentar di SystemParametersInfo:

  • SPI_GETMOUSECLICKLOCK
  • SPI_SETMOUSECLICKLOCK
  • SPI_GETMOUSECLICKLOCKTIME
  • SPI_SETMOUSECLICKLOCKTIME

Konfigurasi Tetikus

Meskipun mouse adalah perangkat input penting untuk aplikasi, tidak setiap pengguna harus memiliki mouse. Aplikasi dapat menentukan apakah sistem menyertakan mouse dengan meneruskan nilai SM_MOUSEPRESENT ke fungsi GetSystemMetrics .

Windows mendukung mouse yang memiliki hingga tiga tombol. Pada mouse tiga tombol, tombol ditetapkan sebagai tombol kiri, tengah, dan kanan. Pesan dan konstanta bernama yang terkait dengan tombol mouse menggunakan huruf L, M, dan R untuk mengidentifikasi tombol. Tombol pada mouse satu tombol dianggap sebagai tombol kiri. Meskipun Windows mendukung mouse dengan beberapa tombol, sebagian besar aplikasi menggunakan tombol kiri terutama dan yang lainnya minimal, jika sama sekali.

Aplikasi juga dapat mendukung roda mouse. Roda mouse dapat ditekan atau diputar. Ketika roda mouse ditekan, roda tersebut bertindak sebagai tombol tengah (ketiga), mengirim pesan tombol tengah normal ke aplikasi Anda. Saat diputar, pesan roda dikirim ke aplikasi Anda. Untuk informasi selengkapnya, lihat bagian Roda Mouse .

Aplikasi dapat mendukung tombol perintah aplikasi. Tombol-tombol ini, yang disebut tombol X, dirancang untuk memungkinkan akses yang lebih mudah ke browser Internet, email elektronik, dan layanan media. Saat tombol X ditekan, pesan WM_APPCOMMAND dikirim ke aplikasi Anda. Untuk informasi selengkapnya, lihat deskripsi dalam pesan WM_APPCOMMAND .

Aplikasi dapat menentukan jumlah tombol pada mouse dengan meneruskan nilai SM_CMOUSEBUTTONS ke fungsi GetSystemMetrics . Untuk mengonfigurasi mouse untuk pengguna sebelah kiri, aplikasi dapat menggunakan fungsi SwapMouseButton untuk membalikkan arti tombol mouse kiri dan kanan. Meneruskan nilai SPI_SETMOUSEBUTTONSWAP ke fungsi SystemParametersInfo adalah cara lain untuk membalikkan arti tombol. Namun, perhatikan bahwa mouse adalah sumber daya bersama, sehingga membalikkan arti tombol memengaruhi semua aplikasi.

XBUTTON

Windows mendukung mouse dengan lima tombol. Selain tombol kiri, tengah, dan kanan ada XBUTTON1 dan XBUTTON2, yang menyediakan navigasi mundur dan maju saat menggunakan browser Anda.

Manajer jendela mendukung XBUTTON1 dan XBUTTON2 melalui pesan WM_XBUTTON* dan WM_NCXBUTTON* . HIWORD WPARAM dalam pesan-pesan ini berisi bendera yang menunjukkan tombol X mana yang ditekan. Karena pesan mouse ini juga pas antara konstanta WM_MOUSEFIRST dan WM_MOUSELAST, aplikasi dapat memfilter semua pesan mouse dengan GetMessage atau PeekMessage.

Dukungan berikut XBUTTON1 dan XBUTTON2:

API berikut dimodifikasi untuk mendukung tombol ini:

Tidak mungkin bahwa jendela anak dalam aplikasi komponen akan dapat langsung menerapkan perintah untuk XBUTTON1 dan XBUTTON2. Jadi DefWindowProc mengirim pesan WM_APPCOMMAND ke jendela saat tombol X diklik. DefWindowProc juga mengirim pesan WM_APPCOMMAND ke jendela induknya. Ini mirip dengan cara menu konteks dipanggil dengan klik kanan—DefWindowProc mengirim pesan WM_CONTEXTMENU ke menu dan juga mengirimkannya ke induknya. Selain itu, jika DefWindowProc menerima pesan WM_APPCOMMAND untuk jendela tingkat atas, itu memanggil hook shell dengan kode HSHELL_APPCOMMAND.

Ada dukungan untuk keyboard yang memiliki kunci tambahan untuk fungsi browser, fungsi media, peluncuran aplikasi, dan manajemen daya. Untuk informasi selengkapnya, lihat Tombol Keyboard untuk Penjelajahan dan Fungsi Lainnya.

Pesan Mouse

Mouse menghasilkan peristiwa input saat pengguna menggerakkan mouse, atau menekan atau melepaskan tombol mouse. Sistem mengonversi peristiwa input mouse menjadi pesan dan mempostingnya ke antrean pesan utas yang sesuai. Ketika pesan mouse diposting lebih cepat daripada utas dapat memprosesnya, sistem membuang semua kecuali pesan mouse terbaru.

Jendela menerima pesan mouse saat peristiwa mouse terjadi saat kursor berada di dalam batas jendela, atau ketika jendela telah mengambil mouse. Pesan mouse dibagi menjadi dua grup: pesan area klien dan pesan area nonkelola. Biasanya, aplikasi memproses pesan area klien dan mengabaikan pesan area nonclient.

Bagian ini membahas topik-topik berikut:

Pesan Mouse Area Klien

Jendela menerima pesan mouse area klien ketika peristiwa mouse terjadi di dalam area klien jendela. Sistem memposting pesan WM_MOUSEMOVE ke jendela saat pengguna memindahkan kursor di dalam area klien. Ini memposting salah satu pesan berikut ketika pengguna menekan atau melepaskan tombol mouse saat kursor berada di dalam area klien.

Pesan Makna
WM_LBUTTONDBLCLK Tombol kiri mouse diklik dua kali.
WM_LBUTTONDOWN Tombol mouse kiri ditekan.
WM_LBUTTONUP Tombol mouse kiri dilepaskan.
WM_MBUTTONDBLCLK Tombol mouse tengah diklik dua kali.
WM_MBUTTONDOWN Tombol mouse tengah ditekan.
WM_MBUTTONUP Tombol mouse tengah dilepaskan.
WM_RBUTTONDBLCLK Tombol kanan mouse diklik dua kali.
WM_RBUTTONDOWN Tombol kanan tetikus ditekan.
WM_RBUTTONUP Tombol kanan mouse dilepaskan.
WM_XBUTTONDBLCLK Tombol tetikus X diklik dua kali.
WM_XBUTTONDOWN Tombol tetikus X ditekan.
WM_XBUTTONUP Tombol tetikus X dilepaskan.

 

Selain itu, aplikasi dapat memanggil fungsi TrackMouseEvent agar sistem mengirim dua pesan lainnya. Ini memposting pesan WM_MOUSEHOVER ketika kursor mengarahkan kursor ke area klien untuk jangka waktu tertentu. Ini memposting pesan WM_MOUSELEAVE ketika kursor meninggalkan area klien.

Parameter Pesan

Parameter lParam dari pesan mouse area klien menunjukkan posisi hot spot kursor. Kata urutan rendah menunjukkan koordinat x titik panas, dan kata urutan tinggi menunjukkan koordinat y. Koordinat ditentukan dalam koordinat klien. Dalam sistem koordinat klien, semua titik di layar ditentukan relatif terhadap koordinat (0,0) sudut kiri atas area klien.

Parameter wParam berisi bendera yang menunjukkan status tombol mouse lainnya dan tombol CTRL dan SHIFT pada saat peristiwa mouse. Anda dapat memeriksa bendera ini saat pemrosesan pesan mouse bergantung pada status tombol mouse lain atau tombol CTRL atau SHIFT. Parameter wParam dapat menjadi kombinasi dari nilai berikut.

Nilai Deskripsi
MK_CONTROL Tombol CTRL tidak berfungsi.
MK_LBUTTON Tombol kiri mouse 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 X pertama mati.
MK_XBUTTON2 Tombol X kedua tidak berfungsi.

 

Pesan Double-Click

Sistem menghasilkan pesan klik dua kali ketika pengguna mengklik tombol mouse dua kali berturut-turut cepat. Saat pengguna mengklik tombol, sistem membuat persegi panjang yang berpusat di sekitar hot spot kursor. Ini juga menandai waktu terjadinya klik. Ketika pengguna mengklik tombol yang sama untuk kedua kalinya, sistem menentukan apakah hot spot masih berada di dalam persegi panjang dan menghitung waktu yang berlalu sejak klik pertama. Jika hot spot masih berada dalam persegi panjang dan waktu yang berlalu tidak melebihi nilai batas waktu klik ganda, sistem akan menghasilkan pesan klik ganda.

Aplikasi bisa mendapatkan dan mengatur nilai batas waktu klik dua kali dengan menggunakan fungsi GetDoubleClickTime dan SetDoubleClickTime . Atau, aplikasi dapat mengatur nilai click-time-out ganda dengan menggunakan bendera SPI_SETDOUBLECLICKTIME dengan fungsi SystemParametersInfo . Ini juga dapat mengatur ukuran persegi panjang yang digunakan sistem untuk mendeteksi klik ganda dengan meneruskan bendera SPI_SETDOUBLECLKWIDTH dan SPI_SETDOUBLECLKHEIGHT ke SystemParametersInfo. Namun, perhatikan bahwa mengatur nilai klik ganda–waktu habis dan persegi panjang memengaruhi semua aplikasi.

Jendela yang ditentukan aplikasi tidak, secara default, menerima pesan klik ganda. Karena overhead sistem yang terlibat dalam menghasilkan pesan klik ganda, pesan ini hanya dihasilkan untuk jendela milik kelas yang memiliki gaya kelas CS_DBLCLKS . Aplikasi Anda harus mengatur gaya ini saat mendaftarkan kelas jendela. Untuk informasi selengkapnya, lihat Kelas Jendela.

Pesan klik ganda selalu merupakan pesan ketiga dalam rangkaian empat pesan. Dua pesan pertama adalah pesan tombol-bawah dan tombol-up yang dihasilkan oleh klik pertama. Klik kedua menghasilkan pesan klik ganda diikuti dengan pesan tombol-up lain. Misalnya, mengklik dua kali tombol mouse kiri menghasilkan urutan pesan berikut:

  1. WM_LBUTTONDOWN
  2. WM_LBUTTONUP
  3. WM_LBUTTONDBLCLK
  4. WM_LBUTTONUP

Karena jendela selalu menerima pesan tombol-turun sebelum menerima pesan klik ganda, aplikasi biasanya menggunakan pesan klik ganda untuk memperluas tugas yang dimulai selama pesan tombol-turun. Misalnya, ketika pengguna mengklik warna di palet warna Microsoft Paint, Paint menampilkan warna yang dipilih di samping palet. Saat pengguna mengklik dua kali warna, Paint menampilkan warna dan membuka kotak dialog Edit Warna .

Pesan Mouse Area Nonkelas

Jendela menerima pesan mouse area nonclient ketika peristiwa mouse terjadi di bagian mana pun dari jendela kecuali area klien. Area nonkelola jendela terdiri dari batas, bilah menu, bilah judul, bilah gulir, menu jendela, tombol minimalkan, dan tombol maksimalkan.

Sistem menghasilkan pesan area nonkelola terutama untuk penggunaannya sendiri. Misalnya, sistem menggunakan pesan area nonkelola untuk mengubah kursor menjadi panah berkepala dua saat hot spot kursor berpindah ke batas jendela. Jendela harus meneruskan pesan mouse area nonclient ke fungsi DefWindowProc untuk memanfaatkan antarmuka mouse bawaan.

Ada pesan mouse area nonclient yang sesuai untuk setiap pesan mouse area klien. Nama-nama pesan ini serupa kecuali bahwa konstanta bernama untuk pesan area nonkelola menyertakan huruf NC. Misalnya, memindahkan kursor di area nonkelola menghasilkan pesan WM_NCMOUSEMOVE , dan menekan tombol mouse kiri saat kursor berada di area nonkelola menghasilkan pesan WM_NCLBUTTONDOWN .

Parameter lParam dari pesan mouse area nonclient adalah struktur yang berisi koordinat x- dan y dari hot spot kursor. Tidak seperti koordinat pesan mouse area klien, koordinat ditentukan dalam koordinat layar daripada koordinat klien. Dalam sistem koordinat layar, semua titik di layar relatif terhadap koordinat (0,0) sudut kiri atas layar.

Parameter wParam berisi nilai hit-test, nilai yang menunjukkan di mana di area nonclient peristiwa mouse terjadi. Bagian berikut menjelaskan tujuan nilai hit-test.

Pesan WM_NCHITTEST

Setiap kali peristiwa mouse terjadi, sistem mengirim pesan WM_NCHITTEST ke jendela yang berisi hot spot kursor atau jendela yang telah mengambil mouse. Sistem menggunakan pesan ini untuk menentukan apakah akan mengirim pesan mouse area klien atau area nonkelola. Aplikasi yang harus menerima pesan gerakan mouse dan tombol mouse harus meneruskan pesan WM_NCHITTEST ke fungsi DefWindowProc .

Parameter lParam dari pesan WM_NCHITTEST berisi koordinat layar hot spot kursor. Fungsi DefWindowProc memeriksa koordinat dan mengembalikan nilai hit-test yang menunjukkan lokasi hot spot. Nilai hit-test dapat menjadi salah satu nilai berikut.

Nilai Lokasi hot spot
HTBORDER Di batas jendela yang tidak memiliki batas ukuran.
HTBOTTOM Di batas horizontal bawah jendela.
HTBOTTOMLEFT Di sudut kiri bawah batas jendela.
HTBOTTOMRIGHT Di sudut kanan bawah batas jendela.
HTCAPTION Di bilah judul.
HTCLIENT Di area klien.
HTCLOSE Di tombol Tutup .
HTERROR Pada latar belakang layar atau pada garis pembagian antara jendela (sama seperti HTNOWHERE, kecuali bahwa fungsi DefWindowProc menghasilkan bip sistem untuk menunjukkan kesalahan).
HTGROWBOX Dalam kotak ukuran (sama dengan HTSIZE).
HTHELP Di tombol Bantuan .
HTHSCROLL Di bilah gulir horizontal.
HTLEFT Di batas kiri jendela.
HTMENU Dalam menu.
HTMAXBUTTON Dalam tombol Maksimalkan .
HTMINBUTTON Di tombol Minimalkan .
HTNOWHERE Pada latar belakang layar atau pada garis pembagian antara jendela.
HTREDUCE Di tombol Minimalkan .
HTRIGHT Di batas kanan jendela.
HTSIZE Dalam kotak ukuran (sama dengan HTGROWBOX).
HTSYSMENU Di menu Sistem atau di tombol Tutup di jendela anak.
HTTOP Di batas horizontal atas jendela.
HTTOPLEFT Di sudut kiri atas batas jendela.
HTTOPRIGHT Di sudut kanan atas batas jendela.
HTTRANSPARENT Di jendela yang saat ini dicakup oleh jendela lain dalam utas yang sama.
HTVSCROLL Di bilah gulir vertikal.
HTZOOM Dalam tombol Maksimalkan .

 

Jika kursor berada di area klien jendela, DefWindowProc mengembalikan nilai uji temuan HTCLIENT ke prosedur jendela. Ketika prosedur jendela mengembalikan kode ini ke sistem, sistem mengonversi koordinat layar hot spot kursor ke koordinat klien, lalu memposting pesan mouse area klien yang sesuai.

Fungsi DefWindowProc mengembalikan salah satu nilai uji hit lainnya saat hot spot kursor berada di area nonkelola jendela. Ketika prosedur jendela mengembalikan salah satu nilai uji hit ini, sistem memposting pesan mouse area nonkelola, menempatkan nilai hit-test dalam parameter wParam pesan dan koordinat kursor dalam parameter lParam .

Mouse Sonar

Fitur aksesibilitas Mouse Sonar secara singkat menunjukkan beberapa lingkaran konsentris di sekitar penunjuk saat pengguna menekan dan melepaskan tombol CTRL. Fitur ini membantu pengguna menemukan penunjuk mouse di layar yang berantakan atau dengan resolusi diatur ke tinggi, pada monitor berkualitas buruk, atau bagi pengguna dengan penglihatan terganggu. Untuk informasi selengkapnya, lihat bendera berikut di SystemParametersInfo:

SPI_GETMOUSESONAR

SPI_SETMOUSESONAR

Mouse Lenyap

Fitur aksesibilitas Mouse Vanish menyembunyikan penunjuk saat pengguna mengetik. Penunjuk mouse muncul kembali ketika pengguna memindahkan mouse. Fitur ini mencegah penunjuk mengaburkan teks yang sedang ditik, misalnya, dalam email atau dokumen lainnya. Untuk informasi selengkapnya, lihat bendera berikut di SystemParametersInfo:

SPI_GETMOUSEVANISH

SPI_SETMOUSEVANISH

Roda Mouse

Roda mouse menggabungkan fitur roda dan tombol mouse. Roda memiliki takik diskrit dan berspasi merata. Saat Anda memutar roda, pesan roda dikirim ke aplikasi Anda saat setiap notch ditemui. Tombol roda juga dapat beroperasi sebagai tombol tengah Windows normal (ketiga). Menekan dan melepaskan roda mouse akan mengirimkan WM_MBUTTONUP standar dan pesan WM_MBUTTONDOWN . Mengklik dua kali tombol ketiga akan mengirim pesan WM_MBUTTONDBLCLK standar.

Roda mouse didukung melalui pesan WM_MOUSEWHEEL .

Memutar mouse mengirimkan pesan WM_MOUSEWHEEL ke jendela fokus. Fungsi DefWindowProc menyebarluaskan pesan ke induk jendela. Seharusnya tidak ada penerusan internal pesan, karena DefWindowProc menyebarkannya ke rantai induk hingga jendela yang memprosesnya ditemukan.

Menentukan Jumlah Garis Gulir

Aplikasi harus menggunakan fungsi SystemParametersInfo untuk mengambil jumlah baris yang digulirkan dokumen untuk setiap operasi gulir (wheel notch). Untuk mengambil jumlah baris, aplikasi melakukan panggilan berikut:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

Variabel "pulScrollLines" menunjuk ke nilai bilangan bulat yang tidak ditandatangani yang menerima jumlah baris yang disarankan untuk digulir saat roda mouse diputar tanpa tombol pengubah:

  • Jika angka ini adalah 0, tidak ada pengguliran yang akan terjadi.
  • Jika angka ini WHEEL_PAGESCROLL, roda roda harus ditafsirkan sebagai mengklik sekali di halaman bawah atau halaman atas wilayah bilah gulir.
  • Jika jumlah baris yang akan digulir lebih besar dari jumlah baris yang dapat dilihat, operasi gulir juga harus ditafsirkan sebagai halaman ke bawah atau operasi halaman ke atas.

Nilai default untuk jumlah baris gulir adalah 3. Jika pengguna mengubah jumlah baris gulir, dengan menggunakan lembar Properti Mouse di Panel Kontrol, sistem operasi menyiarkan pesan WM_SETTINGCHANGE ke semua jendela tingkat atas dengan SPI_SETWHEELSCROLLLINES ditentukan. Ketika aplikasi menerima pesan WM_SETTINGCHANGE , aplikasi kemudian bisa mendapatkan jumlah baris gulir baru dengan memanggil:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

Kontrol yang Menggulir

Tabel di bawah ini mencantumkan kontrol dengan fungsionalitas pengguliran (termasuk garis gulir yang diatur oleh pengguna).

Kontrol Pengguliran
Edit Kontrol Vertikal dan horizontal.
Kontrol kotak daftar Vertikal dan horizontal.
Kotak kombo Saat tidak dijatuhkan, setiap gulir mengambil item berikutnya atau sebelumnya. Saat dijatuhkan ke bawah, setiap gulir meneruskan pesan ke kotak daftar, yang menggulir sesuai.
CMD (Baris perintah) Vertikal.
Tampilan Pohon Vertikal dan horizontal.
Tampilan Daftar Vertikal dan horizontal.
Gulungan Atas/Bawah Satu item pada satu waktu.
Gulir Bilah Trek Satu item pada satu waktu.
Microsoft Rich Edit 1.0 Vertikal. Perhatikan, klien Exchange memiliki versi tampilan daftar dan kontrol tampilan pohon sendiri yang tidak memiliki dukungan roda.
Microsoft Rich Edit 2.0 Vertikal.

 

Mendeteksi Mouse dengan Roda

Untuk menentukan apakah mouse dengan roda tersambung, panggil GetSystemMetrics dengan SM_MOUSEWHEELPRESENT. Nilai pengembalian TRUE menunjukkan bahwa mouse tersambung.

Contoh berikut adalah dari prosedur jendela untuk kontrol edit multibaris:

BOOL ScrollLines(
     PWNDDATA pwndData,   //scrolls the window indicated
     int cLinesToScroll); //number of times

short gcWheelDelta; //wheel delta from roll
PWNDDATA pWndData; //pointer to structure containing info about the window
UINT gucWheelScrollLines=0;//number of lines to scroll on a wheel rotation

gucWheelScrollLines = SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 
                             0, 
                             pulScrollLines, 
                             0);

case WM_MOUSEWHEEL:
    /*
     * Do not handle zoom and datazoom.
     */
    if (wParam & (MK_SHIFT | MK_CONTROL)) {
        goto PassToDefaultWindowProc;
    }

    gcWheelDelta -= (short) HIWORD(wParam);
    if (abs(gcWheelDelta) >= WHEEL_DELTA && gucWheelScrollLines > 0) 
    {
        int cLineScroll;

        /*
         * Limit a roll of one (1) WHEEL_DELTA to
         * scroll one (1) page.
         */
        cLineScroll = (int) min(
                (UINT) pWndData->ichLinesOnScreen - 1,
                gucWheelScrollLines);

        if (cLineScroll == 0) {
            cLineScroll++;
        }

        cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
        assert(cLineScroll != 0);

        gcWheelDelta = gcWheelDelta % WHEEL_DELTA;
        return ScrollLines(pWndData, cLineScroll);
    }

    break;

Aktivasi Jendela

Ketika pengguna mengklik jendela tingkat atas yang tidak aktif atau jendela anak dari jendela tingkat atas yang tidak aktif, sistem mengirim pesan WM_MOUSEACTIVATE (antara lain) ke jendela tingkat atas atau anak. Sistem mengirim pesan ini setelah memposting pesan WM_NCHITTEST ke jendela, tetapi sebelum memposting pesan tombol-turun. Ketika WM_MOUSEACTIVATE diteruskan ke fungsi DefWindowProc , sistem mengaktifkan jendela tingkat atas lalu memposting pesan tombol ke jendela tingkat atas atau anak.

Dengan memproses WM_MOUSEACTIVATE, jendela dapat mengontrol apakah jendela tingkat atas menjadi jendela aktif sebagai akibat dari klik mouse, dan apakah jendela yang diklik menerima pesan tombol-turun berikutnya. Ini dilakukan dengan mengembalikan salah satu nilai berikut setelah memproses WM_MOUSEACTIVATE.

Nilai Makna
MA_ACTIVATE Mengaktifkan jendela dan tidak membuang pesan tetikus.
MA_NOACTIVATE Tidak mengaktifkan jendela dan tidak membuang pesan tetikus.
MA_ACTIVATEANDEAT Mengaktifkan jendela dan membuang pesan tetikus.
MA_NOACTIVATEANDEAT Tidak mengaktifkan jendela tetapi membuang pesan tetikus.

Lihat juga

Memanfaatkan Gerakan Tikus High-Definition