Traka za pomeranje se nastavlja da se pomera nakon što otpustite taster miša

Simptomi

Traka za pomeranje se neprestano pomera čak i kada otpustite levi taster miša. Tip trake za pomeranje nije bitan za ovaj problem, odnosno isti problem se javlja bez obzira na to da li je traka za pomeranje deo prozora ili je kontrola trake za pomeranje.

Uzrok

Do ovog problema obično dolazi kada se izvrši petlja prilikom preuzimanja poruke kao rezultat radnji koje su preduzete za pomeranje po prijemu jedne od poruka sa obaveštenjima na traci za pomeranje. Prilikom pomeranja, u operativnom sistemu Windows počinje petlja prilikom preuzimanja interne poruke. Zadatak ove petlje poruke je da pratite pomeranje i da pošaljete odgovarajuće poruke o obaveštenjima na traci za pomeranje, WM_HSCROLL i WM_VSCROLL. Pomeranje se prekida kada WM_LBUTTONUP primi. Ako se tokom pomeranja pokrene druga petlja poruka, WM_LBUTTONUP preuzima ta poruka i zato što aplikacija nema pristup ovoj petlje za preuzimanje unutrašnje poruke trake za pomeranje, WM_LBUTTONUP ne može da se ispravno šalje. Zbog toga WM_LBUTTONUP nikada nije primljena od strane interne poruke retriver, a pomeranje se nikada ne okončaju. Aplikacija koja se pomera ne mora da preuzme poruke izričito da bi prouzrokovali ovaj problem. Pozivanje bilo koje od sledećih funkcija ili obradu bilo koje poruke koja sadrži petlju za preuzimanje poruke, pri pomeranju može da prouzrokuje gubitak WM_LBUTTONUP. Funkcije navedene ispod spadaju u ovu kategoriju:

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

Rešenje

Pri pomeranju, poruka WM_LBUTTONUP ne bi trebalo da se preuzme iz reda u redu sa bilo kojom prilikom preuzimanja poruka, osim unutrašnje trake za pomeranje. Aplikacija može da dođe do ovog problema na sledeći način:

  • Aplikacija primenjuje petlju za preuzimanje poruke da bi primenio obradu u pozadini, na primer, obradu u pozadini dok traje provodno vreme.

  • Aplikacija primenjuje petlju za preuzimanje poruke radi primenjivanja komunikacije sa drugom aplikacijom ili DLL-om. Na primer, da bi se pomerali sadržaj, aplikacija mora primati podatke sa drugih delova.

Moguća rešenja

Na listi su navedene dve moguće rešenja. Prvo rešenje koristi mnoge od izlaska aplikacija i prozora; Međutim, pod retkim okolnostima prvo rešenje ne može biti izvodljivo. U ovom slučaju može se koristiti drugo zaobilaženje. Međutim, ako je moguće, pokušajte da izbegnete primenu preuzimanja poruka u potpunosti tokom pomeranja.

  • Koristi obradu na osnovu tajmera. Razbijite komplikovanu obradu u manje zadatke i pratite gde se svaki zadatak pokreće i završava, a zatim izvršite svaki zadatak na osnovu poruke tajmera. Kada se sve komponente obrade završe, ubijete tajmer. Pogledajte niže na primer ovog zaobilaznog rješenja.

  • Primenite petlju za preuzimanje poruke, ali se uverite da WM_LBUTTONUP nije preuzeta. Ovo se može postići korišćenjem filtera. Pogledajte ispod neke primere ovog zaobilaznog rješenja.

Primer koji pokazuje zaobilazno rješenje 1

Aplikacija ima kompleksnu proceduru u Bojanki. Prozor za pomeranje poziva (), za pomeranje, generiše poruke u Bojanki. Prilikom slikarstva se odvija obrada u pozadini.

  1. Kada dobijete WM_PAINT poruku postupite na sledeći način:

    1. Poziv na početku boja ().

    2. Kopirajte poništene RECT na globalnu RECT promenljivu (na primer grcPaint) koja će se koristiti u koraku 2. Global RECT grcPaint bi bio Unija prethodno stečenih RECT (grcPaint) i novi neponišteni RECT (PS. rcPaint). Šifra za to će se podsećaće na sledeće:

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

    4. Pozovi EndPaint ().

    5. Postavite tajmer.

    Na ovaj način se ne generišu više WM_PAINT poruka, jer nema nevažećih regiona, a tajmer je podešen, što će generisati WM_TIMER poruke.

  2. Nakon primanja WM_TIMER poruke proverite globalnu promenljivu RECT; Ako nije prazna, uzmite odeljak i slikali ga. Zatim prilagodite globalnu promenljivu RECT tako da ona više ne uključuje obojen region.

  3. Kada se globalna RECT promenljiva isprazni, onda ga ubij.

Primer koji pokazuje zaobilazno rješenje 2

Aplikacija treba da Pribavi neke podatke preko DDE ili nekog drugog mehanizma iz druge aplikacije koja se zatim prikazuje u prozoru. Da bi se pomerali, aplikacija treba da traži, a zatim da pribavi podatke iz aplikacije servera. Postoje tri različita filtera koja se mogu koristiti za podešavanje Peekporuke () i dobijanje informacija. Filteri mogu da se podese pomoću uFilterFirst i Ufilterzadnjeg parametara Peekporuke (). uFilterFirst precizira pesnicu u opsegu koja treba da bude proverena i Ufilterposlednja precizira poslednju poruku u opsegu koje treba proveriti.

  1. Proverite i preuzmite samo povezane poruke za dobijanje potrebnih podataka.

  2. Proverite da li postoje WM_LBUTTONUP bez uklanjanja obrasca. Ako se nalazi u redu čekanja, Break. U suprotnom, preuzmite i pošaljite sve poruke.

  3. Preuzimanje svih poruka manje od WM_LBUTTONUP i veće od WM_LBUTTONUP, ali ne i preuzimanje WM_LBUTTONUP.

Više informacija

Koraci koji reprodukuju problem

Sledi niz događaja koji dovode do gubitka WM_LBUTTONUP poruke:

  1. Kliknite na traku za pomeranje koristeći miš.

  2. 1. korak generiše WM_NCLBUTTONDOWN poruku.

  3. 2. korak uzrokuje da se započne interna poruka Windows interne poruke. Ova petlja poruke traži poruke povezane sa trakom za pomeranje. Svrha ove poruke je da generiše odgovarajuće WM_HSCROLL ili WM_VSCROLL poruke. Kada se WM_LBUTTONUP primi, ponovo će se da se ponavlja ova poruka.

  4. Prilikom prijema WM_HSCROLL ili WM_VSCROLL poruke, aplikacija će se pretvoriti u petlju za preuzimanje poruke direktno ili poziva koje rezultiraju prilikom preuzimanja poruka.

  5. WM_LBUTTONUP se uklanja iz reda po redosledu poruke pomenutu u koraku 4. WM_LBUTTONUP se zatim šalje.

  6. Kao rezultat koraka 5 WM_LBUTTONUP poruka se šalje na drugom mestu, a petlja za preuzimanje unutrašnje poruke, koja je pomenuta u koraku 3, nikada ne prima. Petlja poruke u koraku 3 traži da se WM_LBUTTONUP zaustavi pomeranje. Pošto nije primljena, traka za pomeranje se nastavlja sa pomeranjem.

Potrebna vam je dodatna pomoć?

Unapredite veštine
Istražite obuku
Prvi nabavite nove funkcije
Pridružite se Microsoft insajdere

Da li su vam ove informacije koristile?

Hvala vam na povratnim informacijama!

Hvala za povratne informacije! Izgleda da će biti od pomoći ako vas povežemo sa našim agentima Office podrške.

×