Event MouseMove Isn't able to catch

itaym02

New member
Event MouseMove Isn't able to catch

אני כותב מאין תוכנת צייר פשוטה. יש לי בעיה בציור בסגנון FREEFORM. הלוגיקה היא כזאת: אני לוחץ על העכבר, מרגע זה, בעזרת ארוע MouseMove אני שולח את כל הנקודות עליהם טייל העכבר למטודה שתצייר אותן. הבעייה: הארוע לא מצליח לתפוס את כל הנקודות, וכתוצאה מזה יוצא קו מקוקו ולא רציף (או שאני מזיז את העכבר לאט). רעיונות?
bool IsMouseStillDown =false; //Switch to tell us if the mouse button is still pressed private void WPaintMain_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button==MouseButtons.Left) { IsMouseStillDown=true; } } private void WPaintMain_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (IsMouseStillDown) { FreeForm DrawPoints=new FreeForm(MyGraphics,ToolsColor); //Draw a single point Point CurrentPosition=new Point(e.X,e.Y); DrawPoints.PaintPoint(CurrentPosition); } } private void WPaintMain_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { IsMouseStillDown=false; }​
 

gilad g

New member
המממ

תנסה אולי במקום לצייר את הנקודה ב-MouseMove, לצייר אותה ב-Paint. מה שאני מתכוון אליו הוא שהתוכן של הפונקציה שלך נשאר אותו הדבר, רק ה-event שאליו נרשמים משתנה
 

itaym02

New member
לצערי כן.

אני מניח שהתור של הevents נבדק בקצב מסוים. אתה מכיר דרך להגביר את הקצב הזה? (ומה עם גלריית קוד?)
 

gilad g

New member
הממ

יכול להיות שזו בעיה של windows, שלא שולח את ה-WM_MOUSEMOVE בקצב מספיק גבוה. תנסה לצייר קוים במקום נקודות, ככה שאם היית קודם ב-(1,1), ועכשיו קיבלת event על (2,4), תצייר קו מ-(1,1) ל-(2,4), ולא רק נקודה ב-(4,2)
 

itaym02

New member
מן הסתם זה יעבוד, אך...

אך אני מעדיף פתרון ): אתה לא חושב שהקוים יראו לא טוב על המסך?
 

itaym02

New member
../images/Emo45.gif עובד יפה אבל (תמיד יש אבל)

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

itaym02

New member
../images/Emo4.gif

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

סומבודי

New member
נדמה לי שאפשר להגביל לנקודה

בכל מקרה, הבאתי זאת כשיטה, ולא כשיטה מועדפת.
 

yokidotcom

New member
טיימר

טיימר שיתחיל לרוץ כשמתחילים ללחוץ, ויפסיק כשהעכבר ייעזב
 

itaym02

New member
../images/Emo52.gif אני לא מצליח להבין איך

יש לך איזו דוגמה, או שאתה יכול לפרט יותר?
 

yokidotcom

New member
\\\\\\\\\\\\\\\\\

כשלוחצים על העכבר, תיקרא פונקציה שתיקרא לטיימר (System.Timers.Timer) להתחיל לפעול. הטיימר יצייר נניח 20 פעמים בשניה, איפה שהעכבר עומד. כשעוזבים את העכבר, הטיימר ייפסק.
 

itaym02

New member
עדיין לא - נראה לי שקצב בדיקת התור

נראה לי שקצב בדיקת התור של הארועים משובש. התוצאה זהה לקודם. בכל מקרה - זה הקוד בו השתמשתי:
bool IsMouseStillDown =false; //Switch to tell us if the mouse button is still pressed System.Timers.Timer T; private void WPaintMain_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button==MouseButtons.Left) { IsMouseStillDown=true; T = new System.Timers.Timer(5); T.Elapsed+=new System.Timers.ElapsedEventHandler(T_Elapsed); T.Enabled=true; } } private void T_Elapsed (object sender,System.Timers.ElapsedEventArgs e) { if (IsMouseStillDown) { FreeForm DrawPoints=new FreeForm(MyGraphics,ToolsColor); DrawPoints.PaintPoint(MousePosition); } } private void WPaintMain_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { IsMouseStillDown=false; T.Close(); }​
 

סומבודי

New member
ברור

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

סומבודי

New member
לא ברור לי מהי טכניקת

הציור שלך, מהו FreeForm או מהי השגיאה שאתה נתקל בה. בכל מקרה, שמתי לב שאתה יוצר ומשחרר את T כל הזמן. ייתכן שהמתודה Close יוצרת את הבעיה. הדרך ההגיונית היא לאתחל את T והממבר Elapsed פעם אחת, ולקרוא ל-Start ו-Stop באירועי העכבר. Close מיועדת לשחרור המשאבים שמוקצים ע"י מערכת ההפעלה. (כל טיימר הוא רכיב מערכת).
 

itaym02

New member
אז ככה...

(קודם כל תודה על התשובה למעלה) השגיאה בה אני נתקל היא שהציור אותו אני מצייר יוצא מקוקו. זאת אומרת שהארוע לא נתפס מספיק מהר-> הארוע נתפס לאט יותר מקצב הזזת העכבר. ניסיתי טווח רחב של תדירויות. CLOSE - הסגירה מתבצעת רק כאשר אני משחרר את כפתור העכבר ואין לה כל השפעה במשך הציור (MOVE EVENT), או בשיטה שהסברת: כל כמה מילי שניות. עושה לי רושם שהבעיה עמוקה יותר מרמת הC# - אבל נכון להיום אני הדיוט בC#
 
למעלה