Znaki

Drsni trak se stalno premika, tudi ko spustite levo tipko miške. Vrsta drsnega traku ni pomembna za to težavo, to pomeni, da se pojavi ista težava ne glede na to, ali je drsni trak del okna ali pa je kontrolnik drsnega traku.

Razlog

Do te težave pride običajno, ko je zanka za pridobivanje sporočila izvedena kot rezultat dejanj, sprejetih za drsenje ob prevzemu enega od sporočil za obvestila o drsnem traku. Ko se pomikate, se v sistemu Windows zažene zanka za pridobivanje sporočila. Opravilo te zanke sporočila je, da spremljate drsenje in pošljete ustrezne sporočila za obvestila v drsnem traku, WM_HSCROLL in WM_VSCROLL. Drsenje se prekine, ko je Prejeto WM_LBUTTONUP. Če se med pomikanjem zažene drugo sporočilo, je WM_LBUTTONUPa pridobljena s to zanko sporočila in ker aplikacija nima dostopa do zanke za pridobivanje notranjega sporočila drsnega traku, WM_LBUTTONUP ni mogoče pravilno odpošiljati. Zato notranji prinašalec sporočil nikoli ne prejme WM_LBUTTONUP in se drsenje ne konča. Aplikacija, ki se premika s pomikanjem, ni treba pridobiti sporočil, ki bi izrecno povzročila to težavo. Pokličete lahko katero koli od teh funkcij ali obdelate katero koli sporočilo, ki ima zanko za pridobivanje sporočila, medtem ko se pomikate in se WM_LBUTTONUP izgubi. Spodaj navedene funkcije sodijo v to kategorijo:

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

Rešitev

Med pomikanjem se sporočila WM_LBUTTONUP ne bi smela pridobiti iz čakalne vrste s katero koli zanko za pridobivanje sporočil, ki ni interna drsna palica. Program lahko naleti na to težavo, kot sledi:

  • Aplikacija izvaja zanko za pridobivanje sporočil za izvajanje obdelave ozadja, na primer obdelava ozadja, medtem ko izvajate čas, ki je dolgotrajen.

  • Aplikacija izvaja zanko za pridobivanje sporočil za izvajanje komunikacije z drugim programom ali DLL. Če se želite na primer pomakniti, mora program prejeti podatke od drugod.

Možne rešitve

Spodaj sta navedeni dve možni rešitvi. Prvo rešitev uporabljajo številni izhodni programi in Windows; vendar v redkih okoliščinah prva rešitev morda ni izvedljiva. V tem primeru se lahko uporabi druga rešitev. Če je mogoče, poskusite preprečiti izvajanje pridobivanja sporočil v celoti med pomikanjem.

  • Uporabite časovnik – obdelava na osnovi sporočila. Razdelite zapleteno obdelavo v manjša opravila in spremljajte, kje se vsako opravilo zažene in konča, nato pa izvedite vsako opravilo, ki temelji na sporočilu s časovnikom. Ko so vsi sestavni deli obdelave dokončani, Ubijte časovnik. Glejte spodaj za primer te rešitve.

  • Izvedete zanko za pridobivanje sporočila, vendar se prepričajte, da ga WM_LBUTTONUP ni mogoče pridobiti. To je mogoče doseči z uporabo filtrov. Spodaj si oglejte nekaj primerov te rešitve.

Primer, ki prikazuje nadomestno rešitev 1

Aplikacija ima zapleten postopek barve. Klicanje ScrollWindow (), če se želite pomakniti, ustvari sporočila slikarja. Obdelava ozadja poteka med pleskanjem.

  1. Ko prejmete sporočilo WM_PAINT, naredite to:

    1. Pokličite BeginPaint ().

    2. Kopirajte razveljavljeno vašemu v globalno vašemu spremenljivko (na primer grcPaint), ki jo želite uporabiti v koraku 2. Globalni vašemu grcPaint bi bil sindikat prej dobljenih vašemu (grcPaint) in novo razveljavljeno vašemu (PS. rcPaint). Koda za to bo podobna tej:

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

    4. Pokličite EndPaint ().

    5. Nastavite časovnik.

    Na ta način ni več WM_PAINTih sporočil, ker ni neveljavnih regij in je nastavljen časovnik, ki bo ustvaril WM_TIMER sporočila.

  2. Ko prejmete WM_TIMER sporočilo, preverite globalno vašemu spremenljivko; Če ni prazna, vzemite odsek in ga Pobarvajte. Nato prilagodite globalno vašemu spremenljivko, tako da ne vključuje več pobarvane regije.

  3. Ko je globalna vašemu spremenljivka prazna, nato Ubijte časovnik.

Primer, ki prikazuje nadomestno rešitev 2

Aplikacija mora pridobiti nekaj podatkov prek DDE ali drugega mehanizma iz drugega programa, ki je nato prikazan v oknu. Če se želite pomakniti, mora aplikacija zahtevati in nato pridobiti podatke iz Strežniškega programa. Na voljo so trije različni filtri, ki jih lahko uporabite za nastavitev PeekMessage () in pridobivanje informacij. Filtre lahko nastavite tako, da uporabite parametre uFilterFirst in uFilterLast za PeekMessage (). uFilterFirst določa sporočilo pest v obsegu, ki ga želite preveriti, in uFilterLast določa zadnje sporočilo v obsegu, ki ga želite preveriti.

  1. Preverite in pridobite le povezane sporočila za pridobitev potrebnih podatkov.

  2. Poiščite WM_LBUTTONUP, ne da bi ga odstranili v čakalno vrsto; Če je v čakalni vrsti, Prekini. V nasprotnem primeru pridobite in odpošljite vsa sporočila.

  3. Pridobite vsa sporočila, ki so manjša od WM_LBUTTONUP in večja od WM_LBUTTONUP, vendar ne pridobite WM_LBUTTONUP.

Več informacij

Navodila za reproduciranje težave

V nadaljevanju je zaporedje dogodkov, ki vodijo do izgube sporočila WM_LBUTTONUP:

  1. Kliknite drsni trak z miško.

  2. Korak 1 ustvari WM_NCLBUTTONDOWNo sporočilo.

  3. Korak 2 povzroči, da se zažene zanka notranjega sporočila sistema Windows. Ta zanka sporočila išče sporočila, povezana s pomikanjem po barih. Namen tega sporočila zanke je ustvariti ustrezne WM_HSCROLL ali WM_VSCROLL sporočila. Zanka sporočila in drsenje se prekine, ko prejmete WM_LBUTTONUP.

  4. Ko prejmete sporočilo WM_HSCROLL ali WM_VSCROLL, se aplikacija prikaže neposredno v zanki za pridobivanje sporočila ali pokliče funkcije, zaradi katerih pride do pridobivanja sporočil.

  5. WM_LBUTTONUP je odstranjena iz čakalne vrste s sporočilom zanke, ki je navedena v koraku 4. WM_LBUTTONUP je nato odposlan.

  6. Kot rezultat koraka 5 WM_LBUTTONUP je sporočilo poslano drugje in zanka za pridobivanje notranjega sporočila, omenjena v koraku 3, nikoli ne prejme. Zanka sporočila v koraku 3 išče WM_LBUTTONUP, da se ustavi drsenje. Ker ni Prejeto, se drsni trak nadaljuje s pomikanjem.

Ali potrebujete dodatno pomoč?

Razširite svoja znanja
Oglejte si izobraževanje
Prvi dobite nove funkcije
Pridruži se Microsoftu programa Insider

Vam je bila informacija v pomoč?

Kako ste zadovoljni s kakovostjo prevoda?
Kaj je vplivalo na vašo izkušnjo?

Zahvaljujemo se vam za povratne informacije.

×