Prijavite se pomoću Microsofta
Prijavi se ili izradi račun.
Zdravo,
Odaberite drugi račun.
Imate više računa
Odaberite račun putem kojeg se želite prijaviti.

Simptomi

Klizač se kontinuirano pomiče čak i nakon otpuštanja lijevog gumba miša. Vrsta klizača nije relevantna za taj problem, to jest, isti se problem pojavljuje bez obzira na to je li klizač dio prozora ili je kontrola klizača.

Uzrok

Taj se problem obično pojavljuje kada se izvrši petlja dohvaćanja poruke kao rezultat akcija preuzetih za pomicanje po primitku jedne od poruka obavijesti klizača. Kada se pomičete, u sustavu Windows započinje petlja za dohvaćanje interne poruke. Zadatak ove petlje poruke jest praćenje pomicanja i slanje odgovarajućih poruka obavijesti o klizaču, WM_HSCROLL i WM_VSCROLL. Pomicanje se prestaje kada se WM_LBUTTONUP primi. Ako se tijekom pomicanja pokrene druga petlja poruka, WM_LBUTTONUP se dohvaća uz tu petlju poruke i budući da aplikacija nema pristup internoj petlja dohvaćanja poruke na klizaču, WM_LBUTTONUP se ne može pravilno poslati. Prema tome, WM_LBUTTONUP nikada ne primi interni retriever, a pomicanje se nikad ne završava. Aplikacija koja je pomicanjem ne mora izravno dohvaćati poruke da bi uzrokovala taj problem. Pozivanje bilo koje od sljedećih funkcija ili obrada bilo koje poruke koja ima petlju dohvaćanja poruka, dok se pomicanje može uzrokovati izgubljenu WM_LBUTTONUP. Funkcije navedene u nastavku ulaze u kategoriju:

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

Rješenje

Prilikom pomicanja WM_LBUTTONUP poruka ne smije biti dohvaćena iz reda čekanja prema bilo kojoj petlja dohvaćanja poruka koja nije interna. Zahtjev može naići na ovaj problem na sljedeći način:

  • Aplikacija implementira petlju dohvaćanja poruka radi provedbe obrade pozadine, na primjer, obrade pozadine tijekom izvođenja vremena boje.

  • Aplikacija implementira petlju dohvaćanja poruke da bi implementirali komunikaciju s drugom aplikacijom ili DLL-om. Da bi se, primjerice, trebao kretati, aplikacija mora primati podatke iz drugog mjesta.

Moguće zaobilazna rješenja

U nastavku su navedena dva moguća zaobilaznih rješenja. Prvi zaobilazno rješenje koristi mnoge aplikacije za izlazak i Windows; Međutim, u rijetkim slučajevima prvo zaobilazno rješenje ne može biti izvodljivo. U ovom se slučaju može koristiti drugo zaobilazno rješenje. No ako je moguće, pokušajte izbjegavati implementaciju dohvaćanja poruka u potpunosti dok se pomičete.

  • Koristite obradu mjerača vremena – utemeljenu na poruci. Smanjite složenicu obrade na manje zadatke i pratite gdje se svaki zadatak pokreće i završava, a zatim izvršite svaki zadatak na temelju poruke mjerača vremena. Kada sve komponente obrade budu dovršene, ubijte timer. Pogledajte u nastavku za primjer ovog zaobilaznog rješenja.

  • Implementirati petlju dohvaćanja poruka, ali provjerite je li WM_LBUTTONUP ne dohvaća. To se može postići pomoću filtara. Pogledajte u nastavku za neke primjere ovog zaobilaznog rješenja.

Primjer koji pokazuje zaobilazno rješenje 1

Aplikacija ima složen postupak boje. Pozivanje ScrollWindow (), da biste se pomaknuli, generira poruke boje. Obrada pozadine odvija se prilikom slikanja.

  1. Kada primite poruku o WM_PAINT, učinite sljedeće:

    1. Pozovi BeginPaint ().

    2. Kopirajte poništeni RECT na globalnu varijablu RECT (primjerice, grcPaint) koji će se koristiti u drugom koraku. Globalna RECT grcPaint bila bi jedinstvo prethodno dobivenog RECT (grcPaint) i novi poništeni RECT (PS. rcPaint). Kod za ovo nalikovati će sljedeće:

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

    4. Krajnju boju poziva ().

    5. Postavljanje mjerača vremena

    Na taj se način neće generirati više WM_PAINT poruka, jer nema nevaljanih regija i postavljen je timer, koji će generirati WM_TIMER poruke.

  2. Kada primite poruku WM_TIMER, provjerite globalnu varijablu RECT-a; Ako nije prazna, uzmite odjeljak i obojite je. Zatim prilagodite globalnu varijablu RECT da više ne sadrži oslikano područje.

  3. Kada se globalna RECT varijablu isprazni, zatim ubijte timer.

Primjer koji pokazuje zaobilazno rješenje 2

Aplikacija mora nabaviti neke podatke putem DDE-a ili nekog drugog mehanizma iz druge aplikacije, koja se zatim prikazuje u prozoru. Da biste se pomaknuli, aplikacija mora zatražiti zahtjev, a zatim nabaviti podatke iz poslužiteljske aplikacije. Postoje tri različita filtra koja se mogu koristiti za postavljanje PeekMessage () i dohvaćanje informacija. Filtri se mogu postaviti pomoću parametara uFilterFirst i uFilterLast u PeekMessage (). uFilterFirst određuje šaku poruka u rasponu koji treba provjeriti, a uFilterLast određuje zadnju poruku u rasponu koji će biti potvrđen.

  1. Provjerite i dohvatite samo srodne poruke da biste nabavili potrebne podatke.

  2. Provjerite WM_LBUTTONUP bez uklanjanja obrasca u red čekanja. Ako se nalazi u redu čekanja, prijelom. U suprotnom dohvaćajte i otpremite sve poruke.

  3. Dohvaćajte sve poruke manje od WM_LBUTTONUP i veće od WM_LBUTTONUP, ali ne dohvaćajte WM_LBUTTONUP.

Dodatne informacije

Koraci za reprodukciju problema

Slijedi slijed događaja koji dovode do gubitka poruke WM_LBUTTONUP:

  1. Kliknite klizač pomoću miša.

  2. Prvi korak generira poruku WM_NCLBUTTONDOWN.

  3. Korak 2 uzrokuje započinjanje petlje interne poruke u sustavu Windows. Ova petlja poruka traži poruke vezane uz klizač. Svrha ove petlja poruke jest stvaranje odgovarajućih WM_HSCROLL ili WM_VSCROLL poruka. Petlja poruke i pomicanje prestaje kada se WM_LBUTTONUP primi.

  4. Prilikom primitka WM_HSCROLL ili WM_VSCROLL poruke, aplikacija se pojavljuje u petlja dohvaćanja poruka izravno ili poziva na funkcije koje rezultiraju dohvaćanjem poruka.

  5. WM_LBUTTONUP uklanja se iz reda čekanja pomoću petlje poruke navedene u četvrtom koraku. WM_LBUTTONUP će se zatim poslati.

  6. Kao rezultat koraka 5 WM_LBUTTONUP poruka poslana je na drugo mjesto i petlja za dohvaćanje interne poruke, koja se spominje u trećem koraku, nikada je ne prima. Petlja poruka u koraku 3 traži WM_LBUTTONUP da se zaustavi pomicanje. Budući da nije primljena, klizač se nastavlja pomicanjem.

Potrebna vam je dodatna pomoć?

Želite dodatne mogućnosti?

Istražite pogodnosti pretplate, pregledajte tečajeve za obuku, saznajte kako zaštititi uređaj i još mnogo toga.

Zajednice vam pomažu da postavljate pitanja i odgovarate na njih, pošaljete povratne informacije i čujete se sa stručnjacima s bogatim znanjem.

Jesu li vam ove informacije bile korisne?

Koliko ste zadovoljni jezičnom kvalitetom?
Što je utjecalo na vaše iskustvo?
Ako pritisnete Pošalji, vaše će se povratne informacije iskoristiti za poboljšanje Microsoftovih proizvoda i usluga. Vaš će IT administrator moći prikupiti te podatke. Izjava o zaštiti privatnosti.

Hvala vam na povratnim informacijama!

×