שאלה בקשר ל .Net Timer

Adidi70

New member
שאלה חדשה - אז ככה...

יש לי Panel ואני שם ב- Design כבר תמונה מקובץ מסוים במחשב על כל ה Panel - אני משתמש ב Timer (או Thread-לא ממש משנה) להזיז Label שעל ה Panel (ליצור תנועה מתמשכת) ואחרי כל הזזה אני קורא לשיטה Refresh של ה Panel כמובן כדי לרענן אותו ולהציג את המיקום החדש של ה Components שעל ה Panel. הבעיה שלי (וזה קשור לבעיה שהעליתי קודם) היא שה Timer עובד באיטיות מאוד - ועכשיו גיליתי למה - השיטה Refresh צורכת מה Thread כנראה משאבים רבים - בלי לקרוא לשיטה ה timer יעבוד טוב אך הציור לא יהיה חלק ! מכיוון שאני קורא לשיטה refresh ה Panel מצייר מחדש את כל מה שעליו כולל את התמונה שהעליתי קודם לתוכו - אם אני משתמש בצבע רגיל לצביעת ה Panel הכל עובד חלק !!! הבעיה היא שהוא מצייר שוב ושוב את התמונה גם (דבר שאין לי בו צורך) וזה מאט מאוד את הפעילות!! איך אני יכול לגרום לו לצייר רק את האובייקט שמשתנה (ולא את הרקע!!) או בגדול איך אני יכול לפתור את זה ??
 

nattygur

New member
בכדי לייצר אפליקציות ויזואליות עדיף

להשתמש ב GDI+. בגדול כל אלמנט על המסך הוא חלון וכל חלון מכיל HDC אחד או יותר אשר מאפשרים צביעה וציור על החלון. ה HDC מחזיק מאפיינים שונים אשר קשורים בצביעה וציור של החלון. בכדי לייצר אפליקציה וויזואלית שתגיב מהר רצוי לשלוט על ה HDC והתוצרים שנראים בחלון בעצמך. Net. מאפשר את זה ע"י שימוש במחלקה בשם [1]graphics. המחלקה הזאת מאפשרת לך למלא Bitmap בתמונה ולצייר אותו לחלון בנוסף לכך ישנם לפחות שתי דרכים למנוע צביעת כל ה BitMap בכל פעם שהוא מודפס על החלון : 1) שימוש ב [2]BitBlt (win32 API) או 2) Duoble buffring [1] - http://www.codeproject.com/books/1861004990.asp [2] - http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_20633242.html [3] - http://www.codeproject.com/cs/media/flickerFreeDrawing.asp?print=true מקווה שזה עזר ... נתי גור [MVP]
 

Adidi70

New member
לא הבנתי

אתה מוכן לפחות להסביר את המושגים GDI+ ו HDC
 

nattygur

New member
כן,

GDI - Graphical Device Interface : ספרית API בשם gdi32.dll אשר מספקת ציור גרפי על חלונות. GDI+ זהוא השם שנתנו לאוסף המחלקות תחת NameSapce בשם System.Drawing כאשר המחלקה העקרית היא Graphics. כמובן שסט המחלקות וה Namespaces האלו מאפשר שעמוש ביכולות גרפיות ובצורה פשוטה יותר מאשר win32 (אם כי לא את כל היכולות אשר gdi32 מספק). בקיצור אתה יכול לייצר Bitmap מקובץ ולצייר עליו rectangle. בכל פסק זמן נתון אתה יכול לשנות את מיקום ה Rectangle ולהשתמש בכל אחת מן האופציות שציינתי קודם לעדכן את החלון ללא ציור של כל ה Bitmap מחדש. HDC - Handle to Device Context : זהוא שירות אשר ניתן ע"י מערכת ההפעלה ומאפשר ציור לחלון. ה Device Context הוא למעשה מבנה בזיכרון אשר מחזיק מידע לגבי יכולות ציור על החלון כגון גודל האזור, צבעי רקע, פונטים ועוד... אני ממליץ לקנות ספר בנושא. צרפתי קישור לאוסף של מאמרים בנושא : http://www.c-sharpcorner.com/Graphics.asp
 

Adidi70

New member
אולי תסתכל בדגימה שתבין ...

מה אני רוצה ?? לא נראה לי שכ"כ הבנת אותי - אני חושב שאני מבין ס"הכ די טוב את ה GDI+ ב .Net מצורפים שני קבצי Exe - שניהם בעלי אותם מאפיינים ופקדים ההבדל היחיד הוא שבראשון (Good) אין תמונה שבחרתי בעיצוב הטופס ל Panel ובשני (Bad) יש תמונה ולכן התנועה הרבה הרבה יותר איטית שוב - כי אני קורא לשיטה Refresh של ה Panel וזה מאט לי את התנועה משמעותית!!! (מצורף קובץ Txt - נא להפוך את הסיומת ל Zip ואז לפתוח - תודה!) אולי תוכל לעזור לי עכשיו ??
 

nattygur

New member
דווקא כן הבנתי אותך.

ואני חושב שהכי טוב זה להשתמש ב GDI+. פאנל זה למעשה חלון (יש לו hwnd). צור Graphics מן הפנל טען לתוך הפנל את ה Image של הרקע ואת ה Image שזז. וצייר אותו על המסך. בכל פסיקה של זמן שנה את הציור ב Graphics ותשתמש ב Bitblt לצייר את ה Image מחדש. BitBilt רושם רק ביטים ששונים בין ה יעד והמקור. אתה תקבל תנועה הרבה יותר חלקה (בלי עצירות קטנות). אני יכול להכין לך דוגמה קטנה אבל רק אחרי החג.
 
למעלה