Kerimisriba kerib pärast HIIRENUPU vabastamist endiselt

Sümptomid

Kerimisriba keritakse pidevalt ka pärast hiire vasaku nupu vabastamist. Kerimisriba tüüp pole selle probleemi jaoks oluline, st sama probleem esineb sõltumata sellest, kas kerimisriba on akna osa või kerimisriba juhtelement.

Põhjus

See probleem ilmneb tavaliselt siis, kui sõnumi allalaadimise silmus käivitatakse ühe kerimisriba teate saamisel kerimise käigus tehtud toimingute tulemusena. Kerimise ajal käivitatakse Windowsis sisemine sõnumite toomise tsükkel. Selle sõnumi silmuse ülesandeks on kerimise jälgimine ning vastava kerimisriba teatiste saatmine, WM_HSCROLL ja WM_VSCROLL. Kerimine lõpetatakse, kui WM_LBUTTONUP vastu võetakse. Kui kerimise ajal kuvatakse mõni muu teade, kuvatakse WM_LBUTTONUP selle sõnumi silmuse kaudu ja kuna rakendusel pole kerimisriba sisemiste sõnumite toomise silmust, ei saa WM_LBUTTONUP õigesti saata. Seetõttu WM_LBUTTONUP ei saanud kunagi sisemise sõnumi retriiver ja kerimine pole kunagi lõppenud. Kerimise rakendus ei pea selle probleemi põhjustamiseks sõnumeid selgesõnaliselt üles laadima. Kui helistate mõnda järgmistest funktsioonidest või töötlete sõnumit, mis sisaldavad sõnumi allalaadimise silmust, võib kerimise ajal põhjustada WM_LBUTTONUP kadumise. Allpool loetletud funktsioonid kuuluvad sellesse kategooriasse:

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

Lahendus

Kerimise ajal ei tohi WM_LBUTTONUP sõnumit järjekorrast välja tuua, välja arvatud juhul, kui kerimisriba sisemine esimene. Selle probleemi lahendamiseks võib tekkida järgmine taotlus.

  • Rakendus rakendab sõnumi allalaadimise silmuse, et rakendada taustal töötlemise tausta (nt tausta töötlemine), tehes samal ajal Painti aeganõudvaid toiminguid.

  • Rakendus rakendab sõnumi allalaadimise silmuse, et rakendada suhtlust mõne muu rakenduse või DLL-iga. Näiteks selleks, et kerida, peab rakendus saama andmeid ka mujalt.

Võimalikud lahendused

Allpool on loetletud kaks võimalikku lahendust. Esimest lahendust kasutavad paljud väljuvad rakendused ja Windows; kuid harvadel juhtudel ei pruugi esimene lahendus olla teostatav. Sellisel juhul võib kasutada teist lahendust. Kui võimalik, püüdke siiski kerimise ajal vältida sõnumite allalaadimise täielikku rakendamist.

  • Taimeri-sõnumitel põhineva töötluse kasutamine. Vähendage keerukat töötlemist väiksemateks ülesanneteks ja pidage meeles, kus iga ülesanne algab ja lõpeb, ning seejärel sooritage iga toiming taimeri põhjal. Kui kõik töötlemise komponendid on valmis, siis hävitage taimer. Selle vastukaalu näite leiate altpoolt.

  • Saate rakendada sõnumi allalaadimise silmuse, kuid veenduda, et see ei too WM_LBUTTONUP. Seda saab teha filtrite abil. Selle vastukaalu näited leiate järgmistest teemadest.

Näide, mis näitab lahendust 1

Rakendusel on keerukas Painti protseduur. Helistamine ScrollWindow (), et kerida, genereerib Paint sõnumeid. Tausta töötlemine toimub maalimise ajal.

  1. WM_PAINT sõnumi saamisel tehke järgmist.

    1. Helista BeginPaint ().

    2. Kopeerige kehtetuks tunnistatud rect globaalsele rect muutujale (nt grcPaint), mida kasutatakse juhises 2. Globaalne rect grcPaint oleks varem saadud rect (grcPaint) ja uue kehtetuks tunnistatud rect (PS. rcPaint) Liit. Kood, mis näeb välja järgmine:

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

    4. Helista EndPaint ().

    5. Taimeri määramine.

    Nii ei looda enam WM_PAINT sõnumeid, sest seal pole sobimatuid piirkondi ja taimeri seadistus, mis loob WM_TIMERid sõnumeid.

  2. WM_TIMER teate saamisel kontrollige globaalset rect muutujat. kui see pole tühi, võtke jaotis ja joonistage see. Seejärel reguleerige globaalset rect muutujat, nii et see ei sisalda enam värvitud piirkonda.

  3. Kui globaalne rect muutuja on tühi, siis tapke taimer.

Näide, mis näitab lahendust 2

Rakendus peab hankima andmeid DDE kaudu või mõne muu mõne muu rakenduse kaudu, mis kuvatakse siis aknas. Rakenduse kerimiseks peab rakendus küsima ja seejärel hankima andmed serveri rakendusest. On kolm erinevat filtrit, mida saab kasutada PeekMessage () häälestamiseks ja teabe hankimiseks. Filtreid saab seadistada uFilterFirst ja uFilterLast parameetrite abil PeekMessage (). uFilterFirst määrab valitud vahemiku rusika ja uFilterLast määrab kontrollitavas vahemikus viimase sõnumi.

  1. Kontrollige ja Hankige ainult seotud sõnum (ID) vajalike andmete saamiseks.

  2. Kontrollige WM_LBUTTONUP, eemaldamata see järjekorda; kui see on järjekorras, siis murdke. Vastasel juhul Hankige ja lähetage kõik sõnumid.

  3. Hankige kõik sõnumid, mille väärtus on väiksem kui WM_LBUTTONUP ja suurem kui WM_LBUTTONUP, kuid ei too WM_LBUTTONUP.

Lisateave

Probleemi reprodutseerimise juhised

Järgmine on sündmuste jada, mis viib WM_LBUTTONUP sõnumi kaotsiminekuni.

  1. Klõpsake hiire abil kerimisriba.

  2. Juhis 1 genereerib WM_NCLBUTTONDOWN sõnumi.

  3. Juhis 2 põhjustab Windowsi sisemise sõnumi silmuse käivitamist. Selle teate silmus otsib kerimisribaga seotud sõnumeid. Selle sõnumi silmuse eesmärk on luua sobivad WM_HSCROLL või WM_VSCROLL sõnumid. Sõnumi silmus ja kerimine lõpeb, kui WM_LBUTTONUP vastu võetakse.

  4. WM_HSCROLL või WM_VSCROLL sõnumi saamisel kuvatakse rakendus kas otse sõnumite toomise silmuses või kõned, mille tulemuseks on sõnumite toomine.

  5. WM_LBUTTONUP eemaldatakse järjekorras juhises 4 kirjeldatud teate silmusest. Seejärel saadetakse WM_LBUTTONUP.

  6. Juhise 5 WM_LBUTTONUP tulemusena lähetatakse sõnum mujale ja seda ei saa 3. Juhises 3 oleva teate silmus otsib WM_LBUTTONUP kerimise lõpetada. Kuna see pole vastu võetud, jätkatakse kerimisriba kerimist.

Kas vajate veel abi?

Täiendage oma oskusi
Tutvuge koolitusmaterjalidega
Kasutage uusi funktsioone enne teisi
Liitu Microsofti Insideri programmis osalejad

Kas sellest teabest oli abi?

Kui rahul te tõlkekvaliteediga olete?

Mis mõjutas teie kasutuskogemust?

Kas soovite jagada veel tagasisidet? (Valikuline)

Täname tagasiside eest!

×