Posúvač pokračuje v posúvaní po uvoľnení tlačidla myši

Príznaky

Posúvač sa nepretržite posúva aj po uvoľnení ľavého tlačidla myši. Typ posúvača je irelevantný pre tento problém, to znamená, že rovnaký problém sa vyskytuje bez ohľadu na to, či je posúvač súčasťou okna alebo je ovládací panel posúvača.

Príčina

Tento problém sa vyskytuje zvyčajne pri vykonaní slučky na načítanie správ ako výsledku akcií vykonaných na posúvanie po prijatí niektorého z oznámení upozorňujúcich správ na navigačnom paneli. Pri posúvaní sa v systéme Windows spustí interná slučka na načítanie správ. Úlohou tejto správy slučky je sledovať posúvanie a odoslať príslušné oznámenia o oznámení posúvača, WM_HSCROLL a WM_VSCROLL. Posúvanie sa ukončí po prijatí WM_LBUTTONUP. Ak sa počas posúvania spustí ďalšia slučka správy, WM_LBUTTONUP sa načíta prostredníctvom slučky správy a pretože aplikácia nemá prístup k internej slučke na načítanie správy posúvača, WM_LBUTTONUP sa nedá odoslať správne. Preto WM_LBUTTONUP nikdy nedostane interný retriever správ a posúvanie sa nikdy neukončí. Aplikácia, ktorá je rolovanie, nemusí načítavať správy explicitne, aby spôsobovala tento problém. Volanie na ktorúkoľvek z nasledujúcich funkcií alebo spracovanie ľubovoľnej správy s slučkou na načítanie správ počas posúvania môže spôsobiť, že WM_LBUTTONUP sa stratí. Nižšie uvedené funkcie spadajú do tejto kategórie:

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

Riešenie

Počas posúvania sa nemusí z frontu načítať WM_LBUTTONUP správa akoukoľvek inou slučkou na načítanie správy, než je vnútorná posúvač. Aplikácia môže naraziť na tento problém takto:

  • Aplikácia implementuje slučku na načítanie správy na implementáciu spracovania na pozadí, napríklad na spracovanie pozadia pri vykonávaní časovo náročného programu Skicár.

  • Aplikácia implementuje slučku na načítanie správy na realizáciu komunikácie s inou aplikáciou alebo knižnicou DLL. Ak chcete napríklad posunúť žiadosť, aplikácia musí prijať údaje z iných oblastí.

Možné alternatívne riešenia

Nižšie sú uvedené dva možné alternatívne riešenia. Prvé alternatívne riešenie používa mnoho vystupujúcich aplikácií a Windowsu. za výnimočných okolností však prvé alternatívne riešenie nemusí byť možné. V tomto prípade sa môže použiť druhé alternatívne riešenie. Ak je to možné, skúste sa však počas posúvania úplne vyhnúť implementácii správy.

  • Použite časovač – spracovanie na základe správy. Rozdeľte komplikované spracovanie na menšie úlohy a majte prehľad o tom, kde sa každá úloha začína a končí, a vykonajte každú úlohu na základe správy časovača. Po dokončení všetkých súčastí spracovania zabijte časovač. Nižšie nájdete príklad tohto alternatívneho riešenia.

  • Implementovať slučku na načítanie správy, ale uistite sa, že ju nenačítajú WM_LBUTTONUP. Toto je možné vykonať pomocou filtrov. Niektoré príklady tohto alternatívneho riešenia nájdete nižšie.

Príklad preukazujúci alternatívne riešenie 1

Aplikácia obsahuje zložitú procedúru laku. Volanie ScrollWindow () na posúvanie vytvára správy programu Skicár. Spracovanie pozadia sa uskutočňuje pri maľovaní.

  1. Keď sa zobrazí hlásenie WM_PAINT postupujte takto:

    1. Zavolať BeginPaint ().

    2. Skopírujte zrušené vymeniteľné číslo do globálnej premennej (napríklad grcPaint), ktorá sa má použiť v kroku 2. Globálna grcPaint by bola zjednotením predtým získanej funkcie (grcPaint) a nového neovereného (PS. rcPaint). Kód pre toto bude vyzerať takto:

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

    4. Zavolať EndPaint ().

    5. Nastavte časovač.

    Týmto spôsobom nie sú generované žiadne ďalšie WM_PAINT správy, pretože neexistujú žiadne neplatné oblasti a nastavuje sa časovač, ktorý vygeneruje WM_TIMER správy.

  2. Po prijatí WM_TIMERnej správy Skontrolujte globálnu meniteľný ukazovateľ. Ak nie je prázdna, vezmite sekciu a namaľovať ju. Potom upravte globálnu meniteľný premennú, aby už neobsahovala maľované oblasti.

  3. Po vyprázdnení globálnej premennej premennej potom zabijte časovač.

Príklad preukazujúci alternatívne riešenie 2

Aplikácia potrebuje získať niektoré údaje prostredníctvom DDE alebo iného mechanizmu z inej aplikácie, ktorá sa potom zobrazí v okne. Ak sa chcete posunúť, aplikácia musí požadovať a potom získať údaje zo serverovej aplikácie. K dispozícii sú tri rôzne filtre, ktoré možno použiť na nastavenie PeekMessage () a získanie informácií. Filtre možno nastaviť pomocou parametrov uFilterFirst a uFilterLast PeekMessage (). uFilterFirst určuje správu päsť v rozsahu, ktorý sa má skontrolovať, a uFilterLast určuje poslednú správu v rozsahu, ktorý sa má skontrolovať.

  1. Skontrolujte a načítajte iba súvisiace správy na získanie potrebných údajov.

  2. Skontrolujte, či je WM_LBUTTONUP bez odstránenia formulára frontu; Ak sa nachádza vo fronte, preruší sa. V opačnom prípade sa načítajú a odosielajú všetky správy.

  3. Načítanie všetkých správ, ktoré sú menšie ako WM_LBUTTONUP a väčšie ako WM_LBUTTONUP, ale nenačítajú sa WM_LBUTTONUP.

Ďalšie informácie

Kroky na reprodukovanie problému

Nasleduje postupnosť udalostí, ktoré vedú k strate WM_LBUTTONUPnej správy:

  1. Kliknite na navigačný panel pomocou myši.

  2. Krok 1 generuje WM_NCLBUTTONDOWN správu.

  3. Krok 2 spôsobí spustenie slučky interných správ systému Windows. Táto slučka správy vyhľadáva správy súvisiace s posúvačmi. Účelom tejto správy slučky je generovať vhodné WM_HSCROLL alebo WM_VSCROLL správy. Slučka správy a posúvanie sa ukončí po prijatí WM_LBUTTONUP.

  4. Pri prijatí WM_HSCROLL alebo WM_VSCROLLnej správy sa aplikácia dostane do slučky na načítanie správ priamo alebo volá funkcie, ktoré majú za následok načítanie správ.

  5. WM_LBUTTONUP sa zo frontu odstráni pomocou slučky správy uvedenej v kroku 4. WM_LBUTTONUP sa potom odošle.

  6. Ako výsledok kroku 5 WM_LBUTTONUP správa odoslaná inam a slučka na načítanie interných správ, ktorá je uvedená v kroku 3, nikdy ju nedostane. Slučka správy v kroku 3 hľadá WM_LBUTTONUP na zastavenie posúvania. Vzhľadom na to, že nie je prijatá, posúvač pokračuje v posúvaní.

Potrebujete ďalšiu pomoc?

Rozšírte svoje zručnosti
Preskúmať školenie
Buďte medzi prvými, ktorí získajú nové funkcie
Pripojiť k Microsoft insiderov chcú

Považujete poskytnuté informácie za užitočné?

Ďakujem za vaše pripomienky!

Ďakujeme vám za pripomienky. Pravdepodobne vám pomôže, ak vás spojíme s pracovníkom podpory pre Office.

×