Prisijunkite prie „Microsoft“
Prisijunkite arba sukurkite paskyrą.
Sveiki,
Pasirinkti kitą paskyrą.
Turite kelias paskyras
Pasirinkite paskyrą, kurią naudodami norite prisijungti.

Simptomai

Slinkties juosta nepertraukiamai slenkama net atleidus kairįjį pelės mygtuką. Slinkties juostos tipas neturi reikšmės šiai problemai, tai yra ta pati problema, neatsižvelgiant į tai, ar slinkties juosta yra lango dalis, ar slinkties juostos valdiklis.

Priežastis

Ši problema paprastai atsiranda, kai pranešimų gavimo ciklas vykdomas kaip veiksmų, kurių buvo imtasi slinkant vieną iš slinkties juostos pranešimų pranešimų, rezultatas. Slenkant vidinio pranešimo gavimo ciklas paleidžiamas sistemoje "Windows". Šio pranešimo ciklo užduotis yra sekti slinkimą ir siųsti atitinkamus slinkties juostos pranešimus, WM_HSCROLL ir WM_VSCROLL. Kai bus gautas WM_LBUTTONUP, slinktis nutraukiamas. Jei slinkties metu pradedama kita pranešimų ciklas, WM_LBUTTONUP nuskaitomi iš šio pranešimo linijos, o programa neturi prieigos prie slinkties juostos vidinio pranešimo gavimo ciklo, WM_LBUTTONUP tinkamai išsiųsti negalima. Todėl WM_LBUTTONUP niekada negavote vidinio pranešimo retriveris ir nemirksi niekada nesibaigė. Programa, kuri yra nemirksi, neturi tiesiogiai nuskaityti pranešimo, kad sukeltų šią problemą. Skambinant bet kurią iš šių funkcijų arba apdorojant bet kokį pranešimą, kuriame yra pranešimo gavimo ciklas, slenkant, gali dingti WM_LBUTTONUP. Toliau išvardytos funkcijos priskiriamos šiai kategorijai:

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

Sprendimas

Slenkant, WM_LBUTTONUP pranešimas neturėtų būti nuskaitomi iš eilės pagal bet kurį pranešimo gavimo ciklą, išskyrus slinkties juostos vidinį. Taikomoji programa gali susidurti su šia problema, kaip nurodyta toliau:

  • Taikomoji programa įdiegia pranešimo gavimo ciklą, kad būtų įgyvendintas foninis apdorojimas, pvz., fono apdorojimas, atliekamas naudojant laiko dažus.

  • Taikomoji programa įgyvendina pranešimo gavimo ciklą, kad įgyvendintų bendravimą su kita taikomąja programa arba DLL. Pvz., norint slinkti, taikomajai programai reikia gauti duomenis iš kitur.

Galimi sprendimo būdai

Toliau pateikiami du galimi sprendimo būdai. Pirmą sprendimo būdą naudoja daugelis išeitų taikomųjų programų ir "Windows"; tačiau retais atvejais pirmoji išeitis gali būti neįmanoma. Šiuo atveju gali būti naudojamas antras sprendimas. Tačiau, jei įmanoma, pabandykite visiškai neįgyvendinti pranešimo gavimo.

  • Naudokite laikmačio – pranešimų apdorojimo. Suskirstykite sudėtingą apdorojimą į mažesnes užduotis ir stebėkite, kur pradedama ir baigiasi kiekviena užduotis, tada atlikite kiekvieną užduotį pagal laikmačio pranešimą. Kai visi apdorojimo komponentai yra užbaigti, sunaikinama laikmatis. Toliau ieškokite šio sprendimo būdo pavyzdys.

  • Įgyvendinti pranešimų gavimo ciklą, tačiau įsitikinkite, kad WM_LBUTTONUP jo nenuskaito. Tai galima atlikti naudojant filtrus. Toliau pateikiame keletą šio sprendimo pavyzdžių.

1 problemos sprendimo pavyzdys

Taikomoji programa turi sudėtingą dažų procedūrą. Skambinimas slinkties langą (), kad būtų galima slinkti, sugeneruoja piešimo laiškai. Piešimas atliekamas fono apdorojimas.

  1. Gavę WM_PAINT pranešimą, atlikite šiuos veiksmus:

    1. Skambinti BeginPaint ().

    2. Nukopijuokite negaliojantį rect į visuotinį rect kintamąjį (pvz., grcPaint), kuris bus naudojamas atliekant 2 veiksmą. Visuotinis "rect grcPaint" yra anksčiau gauto rect (grcPaint) ir naujo nepripažinto rect (PS. rcPaint) Sąjunga. Šis kodas bus panašus į šį:

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

    4. Skambinti į "EndPaint" ().

    5. Nustatykite laikmatį.

    Tokiu būdu daugiau WM_PAINT laiškai sugeneruojami, nes nėra neleistinų sričių ir nustatomas laikmatis, kuris sukurs WM_TIMER laiškams.

  2. Gavusi WM_TIMER pranešimą, patikrinkite visuotinį "rect" kintamąjį; jei ji netuščia, Paimkite sekciją ir ją nudažykite. Tada koreguokite visuotinį funkciją rect, kad ji nebeapimtų dažytos srities.

  3. Kai visuotinis "rect" kintamasis yra tuščias, išžudyti laikmatį.

Sprendimo 2 problemos pavyzdys

Taikomajai programai reikia gauti kai kuriuos duomenis naudojant DDE arba kitą kitą taikomąją programą, kuri rodoma lange. Norėdami slinkti, taikomoji programa turi pateikti užklausą ir gauti duomenis iš serverio taikomosios programos. Yra trys skirtingi filtrai, kuriuos galima naudoti norint nustatyti PeekMessage () ir gauti informaciją. Filtrus galima nustatyti naudojant "uFilterFirst" ir "uFilterLast" PeekMessage parametrus (). "uFilterFirst" nurodo pirmoji pranešimą intervale, kurį reikia pažymėti, o uFilterLast nurodo paskutinį norimo pažymėti intervalo pranešimą.

  1. Pažymėkite ir nuskaitykite tik susijusius pranešimus (-us), kad gautumėte reikiamus duomenis.

  2. Patikrinkite, ar nėra WM_LBUTTONUP nepašalindami jos formos; Jei jis yra eilėje, pertrauka. Priešingu atveju, Gaukite ir išsiųs visus savo pranešimą.

  3. Gaukite visus el. laiškams mažesnį nei WM_LBUTTONUP ir daugiau nei WM_LBUTTONUP, bet negaukite WM_LBUTTONUP.

Daugiau informacijos

Problemos atkūrimo veiksmai

Toliau pateikiamas įvykių, vedančių į WM_LBUTTONUP pranešimo praradimą, seka:

  1. Spustelėkite slinkties juostą naudodami pelę.

  2. 1 veiksmu sukuriamas WM_NCLBUTTONDOWN pranešimas.

  3. 2 veiksmas paleidžia "Windows" vidinį pranešimo ciklą. Šio pranešimo ciklas skirtas slinkties juostos susijusiems pranešimams. Šio pranešimo ciklo paskirtis – generuoti atitinkamus WM_HSCROLL arba WM_VSCROLL laiškus. Gavus WM_LBUTTONUP rodomas pranešimų ciklas ir slinktis.

  4. Gavus WM_HSCROLL arba WM_VSCROLL pranešimą, taikomoji programa patenka į pranešimų gavimo ciklą tiesiogiai arba iškviečia funkcijas, kurios lemia laiškų gavimą.

  5. WM_LBUTTONUP iš eilės pašalinama pagal 4 veiksme nurodytą pranešimo ciklą. WM_LBUTTONUP siunčiamas.

  6. Kaip 5 veiksmo rezultatas WM_LBUTTONUP pranešimas siunčiamas kitur ir vidinis pranešimo gavimo ciklas, nurodytas 3 veiksme, niekada jo negauna. 3 veiksme esantis pranešimo ciklas ieško WM_LBUTTONUP, kad sustabdytumėte slinkimą. Jo negavote, slinkties juosta toliau slenkama.

Reikia daugiau pagalbos?

Norite daugiau parinkčių?

Sužinokite apie prenumeratos pranašumus, peržiūrėkite mokymo kursus, sužinokite, kaip apsaugoti savo įrenginį ir kt.

Bendruomenės padeda užduoti klausimus ir į juos atsakyti, pateikti atsiliepimų ir išgirsti iš ekspertų, turinčių daug žinių.

Ar ši informacija buvo naudinga?

Ar esate patenkinti kalbos kokybe?
Kas turėjo įtakos jūsų įspūdžiams?
Paspaudus mygtuką Pateikti, jūsų atsiliepimai bus naudojami tobulinant „Microsoft“ produktus ir paslaugas. Jūsų IT administratorius galės rinkti šiuos duomenis. Privatumo patvirtinimas.

Dėkojame už jūsų atsiliepimą!

×