Masuk dengan Microsoft
Masuk atau buat akun.
Halo,
Pilih akun lain.
Anda memiliki beberapa akun
Pilih akun yang ingin Anda gunakan untuk masuk.

Gejala

Bilah gulir terus bergulir bahkan setelah Anda melepaskan tombol mouse kiri. Tipe bilah gulir tidak relevan dengan masalah ini, yaitu, masalah yang sama terjadi terlepas dari apakah bilah gulir merupakan bagian dari jendela atau merupakan kontrol bilah gulir.

Penyebab

Masalah ini biasanya terjadi ketika pengulangan pencarian pesan dijalankan sebagai hasil tindakan yang diambil untuk menggulir saat menerima salah satu pesan pemberitahuan bilah gulir. Saat menggulir, pengulangan pencarian pesan internal dimulai di Windows. Tugas pengulangan pesan ini adalah untuk melacak gulir dan untuk mengirim pesan pemberitahuan bilah gulir yang sesuai, WM_HSCROLL dan WM_VSCROLL. Scrolling diakhiri setelah WM_LBUTTONUP diterima. Jika pengulangan pesan lain dimulai saat bergulir, WM_LBUTTONUP diambil oleh pengulangan pesan tersebut, dan karena aplikasi tidak memiliki akses ke pengulangan pencarian pesan internal bilah gulir, WM_LBUTTONUP tidak dapat dikirim dengan benar. Oleh karena itu, WM_LBUTTONUP tidak diterima oleh Retriever pesan internal, dan scrolling tidak pernah berakhir. Aplikasi yang sedang bergulir tidak harus mengambil pesan secara eksplisit untuk menyebabkan masalah ini. Memanggil salah satu fungsi berikut ini atau memproses setiap pesan yang memiliki pengulangan pencarian pesan, saat menggulir, bisa menyebabkan WM_LBUTTONUP hilang. Fungsi yang tercantum di bawah ini termasuk dalam kategori ini:

DialogBox() DialogBoxIndirect() DialogBoxIndirectParam() DialogBoxParam() GetMessage() MessageBox() PeekMessage()

Pemecahan Masalah

Saat menggulir, pesan WM_LBUTTONUP tidak boleh diambil dari antrian dengan pengulangan pencarian pesan Selain bilah gulir internal. Aplikasi mungkin menemukan masalah ini sebagai berikut:

  • Aplikasi menerapkan pengulangan pencarian pesan untuk menerapkan pemrosesan latar belakang, misalnya, pemrosesan latar belakang saat melakukan Paint yang memakan waktu.

  • Aplikasi menerapkan pengulangan pencarian pesan untuk menerapkan komunikasi dengan aplikasi lain atau DLL. Misalnya, untuk menggulir, aplikasi harus menerima data dari tempat lain.

Kemungkinan solusi

Dua kemungkinan solusi tercantum di bawah ini. Solusi pertama digunakan oleh banyak aplikasi keluar dan oleh Windows; Namun, di bawah situasi yang jarang solusi pertama mungkin tidak layak. Dalam kasus ini, penanganan masalah kedua mungkin digunakan. Namun, jika memungkinkan, cobalah untuk menghindari penerapan pengambilan pesan sepenuhnya saat menggulir.

  • Gunakan pemrosesan timer-berbasis pesan. Memecah pemrosesan rumit menjadi tugas yang lebih kecil dan melacak di mana setiap tugas dimulai dan berakhir, lalu menjalankan setiap tugas berdasarkan pesan timer. Saat semua komponen pemrosesan selesai, Hentikan timer. Lihat contoh solusi ini di bawah ini.

  • Menerapkan pengulangan pencarian pesan, tapi pastikan WM_LBUTTONUP tidak diambil oleh loop. Ini bisa dilakukan dengan menggunakan filter. Lihat di bawah ini untuk beberapa contoh solusi ini.

Contoh memperlihatkan penanganan masalah 1

Aplikasi memiliki prosedur Paint yang kompleks. Memanggil ScrollWindow (), untuk menggulir, menghasilkan pesan Paint. Pemrosesan latar belakang berlangsung saat melukis.

  1. Saat Anda menerima pesan WM_PAINT lakukan hal berikut:

    1. Panggil BeginPaint ().

    2. Salin rect yang tidak divalidasi ke variabel global rect (misalnya, grcPaint) untuk digunakan di langkah 2. GrcPaint rekt global akan menjadi gabungan rect yang sebelumnya diperoleh (grcPaint) dan rect yang tidak divalidasikan (PS. rcPaint). Kode ini akan menyerupai yang berikut ini:

               RECT grcPaint;    // Should be initialized before getting the                           // first paint message.            :            :         UnionRect(&grcPaint, &ps.rcPaint,&grcPaint);
    3. Panggilan ValidateRect () dengan PS. rcPaint.

    4. Panggil EndPaint ().

    5. Mengatur timer.

    Dengan cara ini, tidak ada lagi WM_PAINT pesan yang dihasilkan, karena tidak ada kawasan yang tidak valid, dan timer disiapkan, yang akan menghasilkan pesan WM_TIMER.

  2. Setelah menerima pesan WM_TIMER, periksa variabel rekt global; Jika tidak kosong, ambil bagian dan lukis. Lalu Sesuaikan variabel rekt global agar tidak lagi menyertakan area yang dicat.

  3. Setelah variabel global rect kosong, maka timer akan dibunuh.

Contoh memperlihatkan solusi 2

Aplikasi harus mendapatkan beberapa data melalui DDE atau mekanisme lainnya dari aplikasi lain, yang kemudian ditampilkan di jendela. Untuk menggulir, aplikasi perlu meminta lalu mendapatkan data dari aplikasi server. Ada tiga filter berbeda yang bisa digunakan untuk menyetel PeekMessage () dan mendapatkan informasinya. Filter dapat disetel dengan menggunakan parameter uFilterFirst dan uFilterLast PeekMessage (). uFilterFirst menentukan pesan tinju dalam rentang yang akan diperiksa dan uFilterLast menentukan pesan terakhir dalam rentang yang akan diperiksa.

  1. Periksa dan ambil hanya pesan terkait untuk mendapatkan data yang diperlukan.

  2. Periksa WM_LBUTTONUP tanpa menghapusnya membentuk antrian; Jika dalam antrian, Hentian. Jika tidak, ambil dan kirim semua pesan.

  3. Ambil semua pesan yang kurang dari WM_LBUTTONUP dan lebih dari WM_LBUTTONUP, tapi jangan ambil WM_LBUTTONUP.

Informasi Selengkapnya

Langkah-langkah untuk mereproduksi masalah

Berikut ini adalah urutan kejadian yang menyebabkan hilangnya pesan WM_LBUTTONUP:

  1. Klik bilah gulir menggunakan mouse.

  2. Langkah 1 menghasilkan pesan WM_NCLBUTTONDOWN.

  3. Langkah 2 menyebabkan pengulangan pesan Windows internal yang akan dimulai. Pengulangan pesan ini mencari pesan yang terkait dengan bilah gulir. Tujuan pengulangan pesan ini adalah untuk menghasilkan pesan WM_HSCROLL atau WM_VSCROLL yang tepat. Pengulangan dan gulir pesan akan berakhir setelah WM_LBUTTONUP diterima.

  4. Saat menerima WM_HSCROLL atau WM_VSCROLL pesan, aplikasi akan masuk ke dalam pengulangan pencarian pesan secara langsung atau fungsi panggilan yang menghasilkan pencarian pesan.

  5. WM_LBUTTONUP dihapus dari antrian dengan pengulangan pesan yang disebutkan di langkah 4. WM_LBUTTONUP kemudian dikirim.

  6. Sebagai hasil dari langkah 5 WM_LBUTTONUP pesan dikirim di tempat lain dan pengulangan pencarian pesan internal, yang disebutkan di langkah 3 tidak pernah menerimanya. Pengulangan pesan di langkah 3 sedang mencari WM_LBUTTONUP untuk menghentikan pengguliran. Karena tidak diterima, bilah gulir terus bergulir.

Perlu bantuan lainnya?

Ingin opsi lainnya?

Jelajahi manfaat langganan, telusuri kursus pelatihan, pelajari cara mengamankan perangkat Anda, dan banyak lagi.

Komunitas membantu Anda bertanya dan menjawab pertanyaan, memberikan umpan balik, dan mendengar dari para ahli yang memiliki pengetahuan yang luas.

Apakah informasi ini berguna?

Seberapa puaskah Anda dengan kualitas bahasanya?
Apa yang memengaruhi pengalaman Anda?
Dengan menekan kirim, umpan balik Anda akan digunakan untuk meningkatkan produk dan layanan Microsoft. Admin TI Anda akan dapat mengumpulkan data ini. Pernyataan Privasi.

Terima kasih atas umpan balik Anda!

×