Wanneer u de muisknop loslaat, wordt de schuifbalk voortgezet.

Symptomen

De schuifbalk schuift continu door, ook nadat u de linkermuisknop loslaat. Het type schuifbalk is niet van belang voor dit probleem, dat wil zeggen dat u hetzelfde probleem ondervindt, ongeacht of de schuifbalk deel uitmaakt van het venster of een besturingselement schuifbalk is.

Oorzaak

Dit probleem treedt meestal op wanneer een lus voor het ophalen van berichten wordt uitgevoerd als het resultaat van de door u geplaatste stappen wanneer u een meldingsbericht van de schuifbalk ontvangt. Wanneer u schuift, wordt een interne lus voor het ophalen van berichten gestart in Windows. De taak van deze berichtenlus is het bijhouden van schuiven en het verzenden van de juiste waarschuwingsberichten voor de schuifbalk, WM_HSCROLL en WM_VSCROLL. Schuiven wordt beëindigd wanneer WM_LBUTTONUP is ontvangen. Als een andere berichten lus wordt gestart tijdens het schuiven, wordt de WM_LBUTTONUP opgehaald door die berichten en omdat een toepassing geen toegang heeft tot de interne lussen voor het opvangen van berichten van de schuifbalk, WM_LBUTTONUP niet juist kunnen worden verzonden. Daarom wordt de WM_LBUTTONUP nooit ontvangen door de interne bericht functie opgehaald en wordt schuiven nooit beëindigd. Het schuiven van de toepassing hoeft u berichten niet expliciet te herstellen om dit probleem te veroorzaken. Als u een van de volgende functies aanroept of een bericht met een lus voor het ophalen van berichten aanroept, kan het WM_LBUTTONUP verloren gaan. De functies die hieronder worden vermeld, behoren tot deze categorie:

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

Oplossing

Tijdens het schuiven moet het WM_LBUTTONUP bericht niet worden opgehaald uit de wachtrij door een niet-geplaatste lus voor het ontvangen van berichten dan de interne schuifbalk. Dit probleem kan als volgt worden veroorzaakt door een toepassing:

  • Een toepassing implementeert een lussen voor het ophalen van berichten om achtergrondverwerking te implementeren, bijvoorbeeld voor het uitvoeren van een tijd met verf.

  • Een toepassing implementeert een lus voor het ophalen van berichten om communicatie met een andere toepassing of DLL te implementeren. Als u bijvoorbeeld wilt schuiven, moet de toepassing gegevens van een andere toepassing ontvangen.

Mogelijke tijdelijke oplossingen

Hieronder vindt u twee mogelijke tijdelijke oplossingen. De eerste tijdelijke oplossing wordt gebruikt door veel versluitings toepassingen en Vensters. de eerste tijdelijke oplossing kan echter niet worden gewijzigd in een zeldzame situatie. In dit geval kunt u de tweede tijdelijke oplossing gebruiken. Probeer het automatisch ophalen van berichten helemaal tijdens het schuiven te voorkomen.

  • Gebruik timer op basis van timer berichten. Verbreek de ingewikkelde verwerkings functie naar kleinere taken en houd bij waar de taak begint en eindigt, en voer vervolgens elke taak uit op basis van een timer bericht. Wanneer alle onderdelen van de verwerking zijn voltooid, beëindigt u de timer. Zie hieronder voor een voorbeeld van deze tijdelijke oplossing.

  • U kunt een lus voor het ophalen van berichten implementeren, maar u kunt er ook voor zorgen dat WM_LBUTTONUP niet wordt opgehaald. U kunt dit doen met filters. Zie hieronder voor enkele voorbeelden van deze tijdelijke oplossing.

Voorbeeld waarin tijdelijke oplossing 1 wordt uitgelegd

Een toepassing heeft een ingewikkelde verf procedure. Bij het bellen van ScrollWindow () om te schuiven, genereert u schilder berichten. Er gebeurt een achtergrondverwerking tijdens het tekenen.

  1. Wanneer u het WM_PAINT bericht ontvangt, doet u het volgende:

    1. Bel BeginPaint ().

    2. Kopieer de ongeldig gevalideerde rect naar een globale rect-variabele, bijvoorbeeld grcPaint), die u in stap 2 wilt gebruiken. De algemene rect grcPaint zou een Unie zijn van de voorheen verkregen rect (grcPaint) en de nieuwe niet-gevalideerde rect (PS. rcPaint). De programmacode voor deze code ziet er ongeveer als volgt uit:

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

    4. Bel EndPaint ().

    5. Stel een timer in.

    Op deze manier worden er geen WM_PAINT berichten gegenereerd, omdat er geen ongeldige gebieden zijn en een timer is ingesteld, waardoor WM_TIMER berichten worden gegenereerd.

  2. Wanneer u een WM_TIMER bericht ontvangt, controleert u de variabele van de algemene Rect. Als dit niet leeg is, kunt u een sectie maken en deze schilderen. Vervolgens kunt u de variabele van een variabele rect aanpassen, zodat deze de geschilderde regio niet meer omvat.

  3. Wanneer de variabele van een variabele rect leeg is, beëindigt u de timer.

Voorbeeld waarbij tijdelijke oplossing 2 wordt uitgelegd

Een toepassing moet gegevens verkrijgen via DDE of een ander mechanisme uit een andere toepassing, die vervolgens in het venster wordt weergegeven. Om te kunnen schuiven moet de toepassing een aanvraag indienen en de gegevens verkrijgen van een servertoepassing. Er zijn drie verschillende filters die kunnen worden gebruikt voor het instellen van een PeekMessage () en het weergeven van de informatie. De filters kunnen worden ingesteld met behulp van de parameters uFilterFirst en uFilterLast van PeekMessage (). in uFilterFirst wordt het eerste bericht in het te controleren bereik opgegeven en wordt in uFilterLast het laatste bericht in het te controleren bereik opgegeven.

  1. U kunt alleen de bijbehorende berichten voor het verkrijgen van de benodigde gegevens controleren en ophalen.

  2. Controleer of WM_LBUTTONUP zonder dat u het formulier de wachtrij verwijdert. Als het zich in de wachtrij bevindt, onderbreking. U kunt ook alle berichten ophalen en verzenden.

  3. U kunt alle berichten die kleiner zijn dan WM_LBUTTONUP en groter dan WM_LBUTTONUP, ophalen, maar de WM_LBUTTONUP niet ophalen.

Meer informatie

Stappen om dit probleem te reproduceren

Hieronder ziet u de volgorde van gebeurtenissen die leiden tot het verlies van het WM_LBUTTONUP bericht:

  1. Klik op de schuifbalk met behulp van de muis.

  2. Met stap 1 genereert u een WM_NCLBUTTONDOWN bericht.

  3. Stap 2 veroorzaakt een interne SMS-bericht dat de lus begint. In dit bericht wordt gezocht naar berichten die betrekking hebben op een schuifbalk. Het doel van deze berichtenlus is het genereren van de juiste WM_HSCROLL-of WM_VSCROLL-berichten. De berichten herhalen en schuiven worden beëindigd wanneer WM_LBUTTONUP is ontvangen.

  4. Wanneer u het WM_HSCROLL-of WM_VSCROLL bericht ontvangt, wordt de toepassing rechtstreeks weergegeven als een fout bij het ophalen van berichten of met oproep functies die resulteren in het ophalen van berichten.

  5. WM_LBUTTONUP wordt uit de wachtrij verwijderd door de lus voor de berichten die u in stap 4 hebt genoemd. WM_LBUTTONUP wordt vervolgens verzonden.

  6. Als gevolg van stap 5 WM_LBUTTONUP bericht elders is verzonden en de interne lus voor het ophalen van berichten, die u in stap 3 ontvangt, wordt het bericht nooit ontvangen. De lus bericht in stap 3 gaat naar de WM_LBUTTONUP om te stoppen met schuiven. Omdat de schuifbalk niet wordt ontvangen, blijft de schuifbalk schuiven.

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagenten.

×