דלג לתוכן הראשי
היכנס דרך Microsoft
היכנס או צור חשבון.
שלום,
בחר חשבון אחר.
יש לך חשבונות מרובים
בחר את החשבון שברצונך להיכנס באמצעותו.

תופעות

פס הגלילה מגולל ברציפות גם לאחר שאתה משחרר את לחצן העכבר הימני. סוג פס הגלילה אינו רלוונטי לבעיה זו, כלומר, אותה בעיה מתרחשת בין אם פס הגלילה הוא חלק מהחלון או שהוא פקד פס גלילה.

סיבה

בעיה זו מתרחשת בדרך כלל כאשר לולאת אחזור הודעות מתבצעת כתוצאה של פעולות שננקטו לצורך גלילה בעת קבלת אחת מהודעות הדיווח של סרגל הגלילה. בעת גלילה, לולאת אחזור של הודעות פנימיות מופעלת ב-Windows. המשימה של לולאת הודעות זו היא לעקוב אחר גלילה ולשלוח את הודעות הדיווח של סרגל הגלילה המתאימות, WM_HSCROLL וWM_VSCROLL. הגלילה מסתיימת לאחר שWM_LBUTTONUP מתקבלת. אם לולאת הודעה אחרת מופעלת במהלך הגלילה, הWM_LBUTTONUP מאוחזרת על-ידי לולאת הודעות זו, ומאחר שיישום אינו מקבל גישה ללולאת האחזור של ההודעות הפנימיות של פס הגלילה, אין אפשרות לשלוח WM_LBUTTONUP בצורה תקינה. לכן, הWM_LBUTTONUP לעולם אינו מתקבל על-ידי ההודעה הפנימית רטריבר, והגלילה לא הסתיימה לעולם. היישום שהוא גלילה אינו צריך לאחזר הודעות באופן מפורש כדי לגרום לבעיה זו. שיחות לכל אחת מהפונקציות הבאות או לעבד כל הודעה הכוללת לולאת אחזור של הודעות, בזמן הגלילה, עלולה לגרום לאובדן הWM_LBUTTONUP. הפונקציות המפורטות להלן נופלות לקטגוריה זו:

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

פתרון

בעת גלילה, אין לאחזר את הודעת הWM_LBUTTONUP מהתור על-ידי לולאת אחזור של הודעות שאינה מייצגת את פס הגלילה הפנימי. יישום עשוי להיתקל בבעיה זו באופן הבא:

  • יישום מיישם לולאה של אחזור הודעות כדי ליישם עיבוד רקע, לדוגמה, עיבוד רקע בעת ביצוע צבע ארוך זמן רב.

  • יישום מיישם לולאה של אחזור הודעות כדי ליישם תקשורת עם יישום או קובץ DLL אחר. לדוגמה, כדי לגלול, האפליקציה צריכה לקבל נתונים ממקום אחר.

פתרונות אפשריים

שתי דרכים אפשריות מפורטות להלן. הפתרון הראשון נמצא בשימוש על-ידי יישומי יציאה רבים ו-Windows; עם זאת, בנסיבות נדירות, ייתכן שהפתרון הראשון אינו אפשרי. במקרה זה, ניתן להשתמש בפתרון השני. עם זאת, אם ניתן, נסה להימנע מיישום אחזור הודעות לגמרי במהלך הגלילה.

  • שימוש בעיבוד מבוסס הודעות שעון עצר. לשבור את העיבוד המסובך למשימות קטנות יותר ולעקוב אחר המקום שבו כל פעילות מתחילה ומסתיימת, ולאחר מכן לבצע כל משימה בהתבסס על הודעת שעון עצר. כאשר כל הרכיבים של העיבוד מושלמים, הרוג את שעון העצר. ראה להלן דוגמה לפתרון זה.

  • יישם לולאת אחזור הודעות, אך ודא שWM_LBUTTONUP אינו מאוחזר על-ידי ההודעה. ניתן לבצע זאת באמצעות מסננים. ראה להלן כמה דוגמאות לפתרון זה.

דוגמה להפגנת פתרון 1

יישום כולל שגרת צבע מורכבת. שיחה ScrollWindow (), כדי לגלול, יוצרת הודעות צבע. עיבוד רקע מתבצע בעת הציור.

  1. כאשר אתה מקבל את הודעת הWM_PAINT בצע את הפעולות הבאות:

    1. Call BeginPaint ().

    2. העתק את הrect הפסולות למשתנה rect כללי (לדוגמה, grcPaint) לשימוש בשלב 2. ה-global rect grcPaint היה איחוד של rect (grcPaint) והrect החדש שלא אומת (ps. rcPaint). הקוד עבור פעולה זו יהיה דומה לפעולות הבאות:

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

    4. Call EndPaint ().

    5. הגדרת שעון עצר.

    בדרך זו, לא ייווצרו הודעות WM_PAINT יותר, מכיוון שאין אזורים לא חוקיים ושעון עצר מוגדר, אשר יפיק הודעות WM_TIMER.

  2. בעת קבלת הודעת WM_TIMER, בדוק את המשתנה הכללי של rect; אם היא אינה ריקה, קח מקטע וצבע אותו. לאחר מכן, התאם את המשתנה rect global כדי שהוא לא יכלול עוד את האזור הנצבע.

  3. לאחר המשתנה הגלובלי rect ריק ולאחר מכן הרוג את שעון העצר.

דוגמה להפגנת פתרון 2

יישום צריך להשיג נתונים מסוימים באמצעות DDE או מנגנון אחר מיישום אחר, שמוצג לאחר מכן בחלון. כדי לגלול, האפליקציה צריכה לבקש ולאחר מכן להשיג את הנתונים מיישום שרת. קיימים שלושה מסננים שונים שניתן להשתמש בהם כדי להגדיר PeekMessage () ולקבל את המידע. ניתן להגדיר את המסננים באמצעות הפרמטרים uFilterFirst ו-uFilterLast של PeekMessage (). uFilterFirst מציין את הודעת האגרוף בטווח שיש לבדוק ו-uFilterLast מציין את ההודעה האחרונה בטווח שיש לבדוק.

  1. סמן ואחזר רק את ההודעות הקשורות לקבלת הנתונים הדרושים.

  2. חפש WM_LBUTTONUP מבלי להסיר את התור; אם הוא נמצא בתור, נתק. אחרת, אחזר ושנה את כל ההודעות.

  3. אחזר את כל ההודעות הקטנות מ-WM_LBUTTONUP וגדול מWM_LBUTTONUP, אך אל תאחזר את WM_LBUTTONUP.

מידע נוסף

השלבים להפקת הבעיה

להלן רצף האירועים המוביל לאבדן הודעת הWM_LBUTTONUP:

  1. לחץ על פס הגלילה באמצעות העכבר.

  2. שלב 1 יוצר הודעת WM_NCLBUTTONDOWN.

  3. שלב 2 גורם להפעלת לולאת הודעות פנימית של Windows. לולאת הודעות זו מחפשת הודעות הקשורות לבר-גלילה. מטרת לולאת הודעות זו היא ליצור הודעות WM_HSCROLL או WM_VSCROLL מתאימות. הלולאה והגלילה של ההודעות מסתיימות לאחר התקבלה של WM_LBUTTONUP.

  4. בעת קבלת הWM_HSCROLL או הודעת WM_VSCROLL, היישום נכנס ללולאה של אחזור הודעות ישירות או שיחות באמצעות פונקציות שמביאות לאחזור של הודעות.

  5. WM_LBUTTONUP יוסר מהתור על-ידי לולאת ההודעה שהוזכרה בשלב 4. לאחר מכן WM_LBUTTONUP משוגר.

  6. כתוצאה מההודעה של שלב 5 WM_LBUTTONUP מתבצעת במקום אחר ולולאת האחזור של ההודעות הפנימיות, שהוזכר בשלב 3 לא מקבלת אותה. לולאת ההודעות בשלב 3 מחפשת את הWM_LBUTTONUP להפסיק לגלול. מכיוון שהוא אינו מתקבל, פס הגלילה ממשיך להיות נגלל.

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

גלה את יתרונות המנוי, עיין בקורסי הדרכה, למד כיצד לאבטח את המכשיר שלך ועוד.

קהילות עוזרות לך לשאול שאלות ולהשיב עליהן, לתת משוב ולשמוע ממומחים בעלי ידע עשיר.

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלך?
בלחיצה על 'שלח', אתה מאפשר למשוב שלך לשפר מוצרים ושירותים של Microsoft. מנהל ה-IT שלך יוכל לאסוף נתונים אלה. הצהרת הפרטיות.

תודה על המשוב!

×