MFC

yair24

Member
MFC

שלום אני רוצה לעשות בMFC תוכנית שמציגה חלון SDI עם עיגול שאני מזיז אותו בעזרת החצים, אבל מספיק לחיצה אחת על חץ והעיגול מתחיל לזוז לכיוון החץ ולא מפסיק כלומר לא תזוזה בודדת תזוזה בודדת אני יודע איך לעשות השאלה איך עושים שיהיה תזוזה רצופה העיגול גם זז והתוכנית ממתינה ללחיצה נוספת על חץ אחר כדי לשנות את כיוון תזוזת העיגול (כאילו עבודה עם פסיקות) תודה יאיר
 

ihovav

New member
תשובה :

תיצור משתנה לכל חץ - וכל פעם שאתה לוחץ על חץ מסויים - תאפס את כל המשתנים ותסמן את המשתנה של אותו החץ בכל איטרציה של התכנית - (בעזרת טיימר או משהו כזה) תבדוק איזה משתנה מסומן ותזיז לפי זה את העיגול כך ניתן לשמור את כיוון התנועה גם אם המקש לא לחוץ
 

yair24

Member
המשך...

מה הכוונה בעזרת טיימר ? כי אני עשיתי דבר כזה : בסוף הפונקציה ONDRAW כתבתי INVALIDATE ואז זה עובד: מספיק שאתה לוחץ פעם אחת העיגול מתחיל לרוץ אבל הכל מהבהב והחלון נתקע ותוקע את כל הWINDOWS אז זאת כנראה לא הדרך מה שאני צריך פה זה לממש POLING שמצד אחד יחכה ללחיצה על מקש כלשהו ומצד שני ידע להזיז את העיגול בזמן שהוא מחכה אני אודה לך מאוד אם תוכל להסביר לי ביתר פירוט על הטיימר יאיר
 

ihovav

New member
תשובה :

1 -> לא עושים אף פעם INVALIDATE לחלון ב ONDRAW - כי המטודה הזו נקראת ב ONDRAW וזה יוצר רקורסיה אינסופית בכל מקרה - אתה יכול לקרוא לONDRAW כאשר משתנה נתון מסויים ואתה רוצה לעדכן את המסך לגבי הטיימר - בעיקרון מערכת ווינדוז עובדת בצורה של שליחת הודעות ההודעות נשלחות למחסנית מסויימת ובכל פעם נשלפת משם הודעה ומנותבת למטודה שמטפלת בה - כאשר לכל חלון יש מחסנית משלו כאשר כתבתי טיימר - התכוונתי לכך שאתה יכול להשתמש בטיימר או במחסנית ההודעות אם אתה משתמש בטיימר - אתה צריך ליצור אובייקט כזה - אבל זה מסובך אני ממליץ לך להשתמש במחסנית ההודעות - בעזרת SENDMESSAGE או POSTMESSAGE (יש הבדל בינהם - תחפש ב MSDN אתה מפקיד הודעה מסויימת שיש לה מטודה שמטפלת בה והיא למעשה "תצייר מחדש את החלון - כלומר תקרא ל INVALIDATE כדי להפחית את הריצודים - אתה יכול להשתמש ב INVALIDATERECT שתקבל את האיזור שהשתנה - אם זה עיגול - היא תקבל שטח שמכיל בפנים את המיקום הקודם של העיגול ואת המיקום החדש שוב - תקרא ב MSDN
 
למעלה