MFC CScrollView

MFC CScrollView

אני מבין שהמחלקה CScrollView מבצעת Scroll של כל החלון בכל WM_VSCROLL message כעת שמתי ChildWindow בחלון של הCScrollView וכעת להפתעתי בכל WM_VSCROLL message משתנה גם המיקום של הChildwindow בהתאם לפעולת הscroll.(בנוסף לפעולת הScroll של חלון הCScrollView) איך CScrollView מבצע את זה האם הוא מבצע movewindow לכל הchildwindows שלו? אם לא הובנתי אני בהחלט מבין את זה( ואנסה להסביר יותר אם אדרש) תודה רבה
 

odstudio

New member
אולי זה זה -

השאלה היא איך אתה יודע שמיקום ה- child windows השתנה? אני מעריך שאתה משתמש בפונקציה GetWindowRect בכדי לדעת זאת, ומכיון שפונקציה זו מחזירה ערכים יחסיים למסך (screen coordinates), אז אתה מקבל שינוי בפוזיציה של החלונות (כי יחסית למסך עצמו, ה- child windows באמת משנים מיקום). כל שעליך לעשות, הוא להמיר את קואורדינטות ה- left וה- top שהתקבלו מהקריאה ל- GetWindowRect, לקואורדינטות היחסיות לחלון ה- Parent, המכיל את ה- childs. זאת תעשה בעזרת הקריאה ל- ScreenToClient, ותעביר לה כפרמטרים POINT המכיל את ה- rect.left וה- rect.top וכן את ה- hWnd של חלון ה- Parent. הערכים שהעברת בפונקציה זו יוחזרו בתוך אותו POINT שהעברת בקריאה. דוגמה:
RECT rc; ::GetWindowRect(hWnd_Child, &rc); POINT pt = {rc.left, rc.top}; ::ScreenToClient(hWnd_Parent, &pt); printf("left,top of child window: %d,%d", pt.left, pt.top);​
 
תודה.וכן

אני משתמש ב GetWindowRect לקבלת קואורדינטות של הchildwindow אבל אני לא רוצה לדעת את הקואורדינטות יחסית לDC של האב (אני יודע שיחסית לDC של האב מיקום החלון קבוע) מה שאני רוצה לדעת זה איך בדיוק מבצע MFC את התזוזה של החלונות הילדים או אולי זה לא חלק מהקוד של MFC אלא משהוא שקשור לAPI טוב אולי אני לא יודע מה אני רוצה בעצמי אני הולך למדוד חם תודה
 

odstudio

New member
אוה...

ובכן, MFC הוא בסה"כ סידרת Classes שעוטפים את ה- API. ודאי שכאשר פונקציה של MFC נקראת, היא בסופו של דבר משתמשת ב- API של Windows. אתה יכול בעזרת ה- Debugger לעקוב בדיוק אחר ההוראות ש- MFC מבצעת (בתנאי שהתקנת את קוד המקור של MFC בזמן התקנת ++ Visual C).
 
למעלה