Simptomi

Ritjosla tiek nepārtraukti ritināta pat pēc peles kreisās pogas atlaišanas. Ritjoslas veids neattiecas uz šo problēmu, tas ir, tā pati problēma rodas neatkarīgi no tā, vai ritjosla ir daļa no loga vai ir ritjoslas vadīkla.

Cēlonis

Šī problēma rodas, parasti, kad tiek izpildīta ziņojuma izguves cilpa, veicot darbības, kas jāveic, lai saņemtu ritināšanu, saņemot vienu no ritjoslas brīdinājuma ziņojumiem. Veicot ritināšanu, operētājsistēmā Windows tiek startēts iekšējas ziņojumu izguves cikls. Šī ziņojuma cilpas uzdevums ir izsekot ritināšanu un nosūtīt atbilstošus ritjoslas brīdinājuma ziņojumus, WM_HSCROLL un WM_VSCROLL. Ritināšana tiek pārtraukta pēc WM_LBUTTONUP saņemšanas. Ja ritināšanas laikā tiek sākta cita ziņojuma cilpa, WM_LBUTTONUP tiek izgūts pēc šī ziņojuma cilpa, un, tā kā lietojumprogrammai nav piekļuves ritjoslas iekšējam ziņojumu izguves ciklam, WM_LBUTTONUP nevar pareizi nosūtīt. Tāpēc WM_LBUTTONUP nekad nesaņem iekšējie ziņojumi, un ritināšanu nekad nav beigusies. Lietojumprogrammai, kas tiek ritināta, nav skaidri jāizdzēš ziņojumi, lai varētu izraisīt šo problēmu. Zvanot uz jebkuru no tālāk norādītajām funkcijām vai apstrādājot jebkuru ziņojumu, kuram ir ziņojuma izguves cilpa, ritināšanu var izraisīt WM_LBUTTONUP zaudēšanu. Tālāk norādītās funkcijas ietilpst šajā kategorijā:

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

Risinājums

Ritinot WM_LBUTTONUP ziņojumu nedrīkst izgūt no rindas pēc jebkuras citas ziņojumu ielādes cilpas, nevis uz ritjoslas iekšējo. Lietojumprogramma var sastapties ar šo problēmu, kā norādīts tālāk.

  • Lietojumprogramma ievieš ziņojumu izguves ciklu, lai ieviestu fona apstrādi, piemēram, fona apstrādi, veicot krāsu.

  • Lietojumprogramma ievieš ziņojumu ielādes ciklu, lai īstenotu saziņu ar citu lietojumprogrammu vai DLL. Piemēram, lai ritinātu, lietojumprogrammai ir jāsaņem dati no citurienes.

Iespējamie risinājumi

Tālāk norādīti divi iespējamie risinājumi. Pirmo risinājumu izmanto daudzas iziešanas lietojumprogrammas un logi. Tomēr retos gadījumos pirmais risinājums, iespējams, nav iespējams. Šajā gadījumā var izmantot otro risinājumu. Tomēr, ja iespējams, mēģiniet izvairīties no pilnīgas ziņojumu izguves ieviešanas ritināšanas laikā.

  • Izmantojiet taimera ziņojumu apstrādi. Izvelciet sarežģītas apstrādes apjomus uz mazākiem uzdevumiem un sekojiet katram uzdevuma sākumam un beigām, pēc tam veiciet katru uzdevumu, pamatojoties uz taimera ziņojumu. Kad visi apstrādes komponenti ir pabeigti, nošaujiet taimeri. Šī risinājuma piemēru skatiet tālāk.

  • Ieviesiet ziņojumu izguves ciklu, taču pārliecinieties, ka WM_LBUTTONUP nav izgūts. To var izdarīt, izmantojot filtrus. Tālāk skatiet dažus šī risinājuma piemērus.

Piemērs, kurā tiek demonstrēts risinājums 1

Lietojumprogrammai ir sarežģīta Paint procedūra. Zvana ScrollWindow (), lai ritinātu, ģenerē Molberta ziņojumus. Fona apstrāde notiek krāsošanas laikā.

  1. Kad saņemat WM_PAINT ziņojumu, veiciet tālāk norādītās darbības.

    1. Zvani BeginPaint ().

    2. Kopējiet nederīgās programmas grcPaint, kas tiek izmantota 2. darbībā (piemēram,). Globālais rektors grcPaint būtu iepriekš iegūtās rektors (grcPaint) un jaunās nederīgās (PS. rcPaint) Savienība. Tā kods līdzinās tālāk norādītajam.

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

    4. Zvani EndPaint ().

    5. Iestatīt taimeri.

    Šādā veidā vairs netiek ģenerēti WM_PAINT ziņojumi, jo nav nederīgu reģionu un ir iestatīts taimeris, kas ģenerēs WM_TIMER ziņojumus.

  2. Saņemot WM_TIMER ziņojumu, pārbaudiet globālo ", kas ir globālais Mainīgais"; Ja tā nav tukša, izmantojiet sadaļu un izkrāsojiet to. Pēc tam koriģējiet globālo pārveidošanas mainīgo, lai tajā vairs netiktu iekļauts krāsotais reģions.

  3. Pēc tam, kad globālā vērtība ir tukša, pēc tam Nogaliniet taimeri.

2. risinājuma pierādīšanas piemērs

Lietojumprogrammai ir jāiegūst dati, izmantojot DDE vai kādu citu mehānismu no citas lietojumprogrammas, kas pēc tam tiek parādīta logā. Lai ritinātu, lietojumprogrammai ir jāpieprasa un pēc tam jāiegūst dati no servera lietojumprogrammas. Ir trīs dažādi filtri, ko var izmantot, lai iestatītu PeekMessage () un iegūtu informāciju. Filtrus var iestatīt, izmantojot uFilterFirst un uFilterLast parametrus PeekMessage (). uFilterFirst norāda dūres ziņojumu diapazonā, kas ir pārbaudāms, un uFilterLast norāda pēdējo ziņojumu diapazonā, kuru vēlaties atzīmēt.

  1. Pārbaudiet un izgūstiet tikai saistītos ziņojumus, lai iegūtu nepieciešamos datus.

  2. Pārbaudiet, vai nav WM_LBUTTONUP, noņemot to no rindas. Ja tas ir rindā, pārtraukums. Pretējā gadījumā izgūstiet un nosūtiet visus ziņojumus.

  3. Izgūstiet visus ziņojumus, kas mazāki par WM_LBUTTONUP un ir lielāki par WM_LBUTTONUP, bet neizgūstiet WM_LBUTTONUP.

Papildinformācija

Darbības, lai atveidotu problēmu

Tālāk ir parādīts notikumu secība, kas izraisa WM_LBUTTONUPā ziņojuma zaudēšanu.

  1. Noklikšķiniet uz ritjoslas, izmantojot peli.

  2. 1. darbībā tiek ģenerēts WM_NCLBUTTONDOWN ziņojums.

  3. 2. darbība izraisa Windows iekšējā ziņojuma cilpas startēšanu. Šis ziņojuma cilpa meklē ar ritjoslu saistītus ziņojumus. Šī ziņojuma cikla nolūks ir ģenerēt atbilstošus WM_HSCROLL vai WM_VSCROLL ziņojumus. Ziņojuma cilpa un ritināšana tiek beigta pēc WM_LBUTTONUP saņemšanas.

  4. Saņemot WM_HSCROLL vai WM_VSCROLL ziņojumu, lietojumprogramma iekļūst ziņojuma izguves cilpā tieši vai zvana funkcijās, kuras rezultātā tiek izgūti ziņojumi.

  5. WM_LBUTTONUP no rindas tiek noņemts pēc 4. darbībā minētās ziņojuma cilpas. WM_LBUTTONUP pēc tam tiek pārsūtīts.

  6. 5. darbības rezultātā WM_LBUTTONUP ziņojums tiek nosūtīts citur, bet 3. darbībā minētais iekšējo ziņojumu izguves cikls nekad netiek saņemts. 3. darbībā ziņojuma cilpa meklē WM_LBUTTONUP, lai pārtrauktu ritināšanu. Tā kā tas nav saņemts, ritjosla turpina ritināšanu.

Nepieciešama papildu palīdzība?

Vēlaties vairāk opciju?

Izpētiet abonementa priekšrocības, pārlūkojiet apmācības kursus, uzziniet, kā aizsargāt ierīci un veikt citas darbības.

Kopienas palīdz uzdot jautājumus un atbildēt uz tiem, sniegt atsauksmes, kā arī saņemt informāciju no ekspertiem ar bagātīgām zināšanām.