Rullnings listen fortsätter att bläddra efter att du släpper upp mus knappen

Symptom

Rullnings listen bläddrar kontinuerligt när du släpper den vänstra mus knappen. Typen av rullnings List är irrelevant för det här problemet, det vill säga samma problem uppstår oavsett om rullnings listen är en del av fönstret eller är en rullnings List.

Orsak

Det här problemet uppstår vanligt vis när en hämtnings slinga för meddelanden körs när ett meddelande om att en rullnings List får ett meddelande. När du bläddrar startas en intern loop i Windows. Denna meddelande åtgärd är att hålla reda på rullningen och skicka lämpliga meddelanden om rullnings listen, WM_HSCROLL och WM_VSCROLL. Rullningen avbryts när WM_LBUTTONUP har mottagits. Om en annan meddelande slinga startas under bläddring hämtas WM_LBUTTONUP av den här slingan, och eftersom ett program inte har åtkomst till rullnings listens hämtning av intern meddelande, kan WM_LBUTTONUP inte skickas korrekt. Därför tas WM_LBUTTONUP aldrig emot av den interna meddelande hämtningen, och rullningen avslutas inte. Programmet som rullas behöver inte hämta meddelanden uttryckligen för att orsaka det här problemet. Om du anropar någon av följande funktioner eller behandlar ett meddelande som har en loop för att hämta meddelanden kan det orsaka att WM_LBUTTONUP förloras när du rullar. De funktioner som visas nedan följer den här kategorin:

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

Lösning

När du bläddrar kan WM_LBUTTONUP-meddelandet inte hämtas från kön av någon annan rad än rullnings listen. Det kan hända att ett program följer med följande:

  • Ett program implementerar en loop för att få en bakgrunds behandling, till exempel bakgrunds behandling när en tid förbrukas.

  • Ett program implementerar en slinga för att en fråga implementerar kommunikation med ett annat program eller en annan DLL-fil. Om du till exempel vill bläddra måste programmet ta emot data från någon annan plats.

Möjliga lösningar

Två möjliga lösningar visas nedan. Den första lösningen används av många avslutade program och Windows; den första lösningen kanske inte är ett genomförbart alternativ under sällsynta omständigheter. I det här fallet kan den andra lösningen användas. Men om möjligt kan du försöka undvika att implementera meddelande hämtningen helt när du bläddrar.

  • Använd timer-baserad bearbetning. Dela upp den komplexa processen i mindre uppgifter och håll reda på var varje aktivitet startar och slutar och utför sedan varje uppgift baserat på ett timer-meddelande. När alla komponenter i bearbetningen är slutförda avslutar du timern. Se nedan för ett exempel på denna lösning.

  • Implementera en loop för att hämta meddelande men se till att WM_LBUTTONUP inte hämtas. Det kan du göra genom att använda filter. Här är några exempel på den här lösningen.

Exempel demonstrerar lösning 1

Ett program har en komplex målnings procedur. När du ringer ScrollWindow () för att bläddra genereras färgmeddelandena. Bakgrunds bearbetningen sker när du målar.

  1. När du får WM_PAINT meddelandet gör du följande:

    1. Ring BeginPaint ().

    2. Kopiera det invaliderade rect till en global rect-variabel (till exempel grcPaint) som ska användas i steg 2. Den globala rect-grcPaint skulle vara en union av tidigare hämtade rect (grcPaint) och det nya ogiltiga rect (PS. rcPaint). Koden för detta ser ut ungefär så här:

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

    4. Ring EndPaint ().

    5. Ange en klocka.

    På så sätt genereras inte fler WM_PAINT meddelanden, eftersom det inte finns några ogiltiga områden och en timer har kon figurer ATS, vilket skapar WM_TIMER meddelanden.

  2. När du får ett WM_TIMER meddelande kontrollerar du den globala rect-variabeln. om den inte är tom kan du ta ett avsnitt och måla det. Justera sedan den globala rect-variabeln så att den inte längre innehåller det målade området.

  3. När den globala rect-variabeln är tom kan du avsluta timern.

Exempel demonstrerar lösning 2

Ett program måste skaffa vissa data via DDE eller någon annan mekanism från ett annat program, som sedan visas i fönstret. För att kunna bläddra måste programmet begära och hämta data från en server tillämpning. Det finns tre olika filter som kan användas för att konfigurera en PeekMessage () och få information. Filtren kan konfigureras med hjälp av uFilterFirst-och uFilterLast-parametrarna för PeekMessage (). uFilterFirst anger knytnävshälsning meddelande i området som ska kontrol leras och uFilterLast anger det sista meddelandet i det område som ska markeras.

  1. Kontrol lera och hämta bara relaterade meddelanden för att få nödvändig information.

  2. Sök efter WM_LBUTTONUP utan att ta bort den från kön; om den finns i kön är det bara att bryta. Annars kan du hämta och skicka alla meddelanden.

  3. Hämta alla meddelanden som är mindre än WM_LBUTTONUP och större än WM_LBUTTONUP, men du behöver inte hämta WM_LBUTTONUP.

Mer information

Steg för att återskapa problemet

Här följer en sekvens med händelser som leder till att WM_LBUTTONUP meddelande försvinner:

  1. Klicka på rullnings listen med musen.

  2. Steg 1 skapar ett WM_NCLBUTTONDOWN meddelande.

  3. Steg 2 gör att en intern meddelande slinga i Windows startas. Den här meddelande slingan letar efter rullnings bar meddelanden. Syftet med detta meddelande är att skapa lämpliga WM_HSCROLL eller WM_VSCROLL meddelanden. Meddelande slingan och rullningen avslutas när WM_LBUTTONUP tas emot.

  4. När du får WM_HSCROLL eller WM_VSCROLL meddelande får programmet antingen en direkt-eller samtals funktion som gör att meddelanden kan hämtas.

  5. WM_LBUTTONUP tas bort från kön av den meddelande slinga som nämns i steg 4. WM_LBUTTONUP skickas iväg.

  6. Resultatet av steg 5 WM_LBUTTONUP meddelandet skickas någon annan stans och den interna slingan för meddelanden som nämns i steg 3 tar aldrig emot det. Meddelande slingan i steg 3 letar efter WM_LBUTTONUP att sluta Bläddra. Eftersom det inte tas emot fortsätter rullnings listen att bläddra.

Behöver du mer hjälp?

Utöka dina kunskaper
Utforska utbildning
Få nya funktioner först
Anslut till Microsoft Insiders

Hade du nytta av den här informationen?

Tack för din feedback!

Tack för din feedback! Det låter som att det kan vara bra att koppla dig till en av våra Office-supportrepresentanter.

×