איך בונים "צייר"

smat

New member
איך בונים "צייר"

תוכנית קטנה כמו painter ויותר ספציפית איך אפשר לצייר מבלי שהציור ימחק ואיך שומרים את הציור
 

IdleThought

New member
ווקטור או ראסטר?

זו השאלה הראשונה, האם הכוונה היא לעבוד בצורה של מפת סיביות או בצורה של רצף פקודות שמבטאות ציור במקרה של ראסטר : בוחרים משטח כלשהו וניגשים לאובייקט GRAPHICS שלו , ובונים פונקציה קטנטנה שמציירת עליו (עיגול קו נקודה תמונה) במקרה שהוא נלחץ תוך שימוש בפונקציות ציור המובנות באובייקט GRAPHICS, והאובייקט הזה גם יכול לייצא לקובץ תמונה הערה: לא ניתן להזיז,למחוק, לשנות , UNDO בצורה נוחה בצורת עבודה שכזו כי כל שינוי שמתבצע מתמזג מיד כתמונה בתוך המשטח במקרה של ווקטור: קצת יותר טריקי אבל מהנה, ראשית מתכננים את מבנה הנתונים שיחזיק לך את מבנה התמונה שאמור להחזיק ישויות כגון :תמונות עם פרמטרים של עיצוב, קווים , צבעים וגרדיאנטים, טקסטים והזחות, נקודות, PATHS, והכי הכי מומלץ-> שכבות לאחר מכן מתכננים אובייקט שירנדר את מבנה הנתונים שלך על גבי אובייקט GRAPHICS יש צורך גם לתכנן אינטרקאציה ( כאשר לוחצים על רכיב בתמונה, שהוא יהפוך לרכיב פעיל ופעולות גרירה ועיצוב יפעלו עליו בלבד) אני ממליץ לקחת את ממש העבודה של פלאש בתור תיכנון של GUI, הוא ממש נוח לשימוש ומאוד קל לבניה בהצלחה !
 

smat

New member
לא ממש הבנתי

שכחתי לציין שאני כותב ב-C# לא מצאתי שיש אובייקט graphics לאף אחד מהפקדים
 

IdleThought

New member
המפ

Graphica g= somecontrol.creategrphics(); ואז אתה מצייר על g לכל הנושא הזה קוראים GDI+ , גגלהו היטב
 

Justin Angel

New member
קה פרובלמה מואי צ'יקיטה?

מסכים ומרחיב את נושא הראסטר. עדיף להימנע מציור ישירות על הטופס עצמו. הסיבה היא שאירועים שגורמים מחדש לציור הטופס (למשל, הזזה מחוץ לגבלות המסך ובחזרה לתוך המסך או השמה של טופס מעל הטופס) אינם שומרים את כל השינויים שבוצעו. מדובר בבעיה ידועה והגיונית לחלוטין, הרי לא נתנו למערכת ההפעלה שלנו שום הוראה לשמור על ציור המסך. עדיף לשמור ברמת הטופס\פקד\משטח-הציור על אובייקט מסוג Bitmap שעליו נבצע את כל הציורים ואותו נצייר על הטופס. למשל אם נרצה לצייר על כל הטופס שלנו:
// in our form private Bitmap bitmapThatHasAllCustomDrawingsOnIt;​
עכשיו נרצה שבכל אירוע ציור מחדש של הטופס הוא יצייר מחדש את כל ה-Bitmap שלנו בחזרה מהפינה הימנית העליונה:
// in designer.cs this.Paint += new System.Windows.Forms.PaintEventHandler(this.form1_Paint); // in our form1.cs private void form1_Paint( object sender, System.Windows.Forms.PaintEventArgs e) { Graphics bitmapGraphics; bitmapGraphics = e.Graphics; bitmapGraphics.DrawImage( bitmapThatHasAllCustomDrawingsOnIt, 0, 0, bitmapThatHasAllCustomDrawingsOnIt.Width, bitmapThatHasAllCustomDrawingsOnIt.Height); bitmapGraphics.Dispose(); } // initlize Bitmap in form load bitmapThatHasAllCustomDrawingsOnIt = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);​
ועכשיו במקום באופן קבוע לצייר על הטופס נדאג תמיד לצייר על ה-Bitmap הפנימי שלנו ולהודיע לטופס "תקשיב טופס, צריך לצייר אותך מחדש" ואת זה נעשה באמצעות קריאה ל-this.Invalidate.
private void DoSomeDrawing() { Graphics bitmapGraphics; bitmapGraphics = Graphics.FromImage(bitmapThatHasAllCustomDrawingsOnIt); bitmapGraphics.DrawLine(...); bitmapGraphics.Dispose(); this.Invalidate(); }​
ועכשיו אם נרצה לשמור את כל הציורים המיוחדים שלנו נוכל להשתמש פשוט במתודת Bitmap.Save.
// write image using (FileStream fs = new FileStream(@"c:\myBmp.bmp",FileMode.OpenOrCreate)) { bitmapThatHasAllCustomDrawingsOnIt.Save(fs, System.Drawing.Imaging.ImageFormat.Bitmap); fs.Close(); }​
 

smat

New member
תודה רבה

גם אני חשבתי בכיוון הזה אבל לא ידעתי איך ליישם את זה תודה על העזרה
 
למעלה