פורסם 2007 באפריל 418 שנים יצרתי צייר (דומה לשל ווינדוס) אבל אם אני גורר את החלון מחוץ לגבולות המסך אם שם עליו עוד חלון הגרפיקה נמחקת....איך אני מונע את הדבר הזה בצורה הטובה ביותר?
פורסם 2007 באפריל 418 שנים אתה אמור לעדכן את הציור שלך באירוע Paint של ה- control בתוכו את מצייראני יודע שיש טכניקה כדי לעדכן רק את החלק שהוסתר ע"י חלון אחר ע"מ ליעל את השיפור רק שאני לא זוכר איך זה הולךבמקרה הפחות יעיל פשוט תצייר את כל הציור מחדש את ה- data של הציור אני מניח שאתה שומר באיזשהו Collection שמקבל אובייקטים שמממשים את הממשק של Draw
פורסם 2007 באפריל 518 שנים אפשרות אחרת היא לצייר ל Bitmap כלשהו ולא ישירות לחלון ואז ב event handler של Paint אתה מצייר את ה bitmap לחלון (או רק את החלק שאתה צריך).
פורסם 2007 באפריל 518 שנים מחבר הצייר שלי בעיקר משתמש במברשות, אז איך בדיוק אני "שומר" על הציור??....לא קיבלתי כאן איזושהי תשובה שמסבירה איך אני שומר על הציור כאשר הוא מוסתר או יוצא מגבולות המסך שלא יימחק
פורסם 2007 באפריל 518 שנים קיבלת שני הסברים. אני אפרט קצת יותר.בכל פעם שהחלון צריך לצייר את עצמו מחדש נקרא האירוע Paint של החלון. Windows שולח הודעה לחלון לצייר את עצמו מחדש כשהסמן זז מעליו, כשחלק מהחלון הוסתר ואז "התגלה" מחדש וכו'. לכן הצורות שלך נמחקות - אתה לא מצייר אותן מחדש. אתה צריך להוסיף event handler לאירוע Paint או לדרוס את OnPaint ולצייר שם מחדש את הצורות.דרך אחת שהציע לך NJorl היא לשמור את המידע של כל הצורות שציירת (מיקום, צבע וכו') ואז ב Paint לעבור על כולן ולצייר אותן.אפשרות אחרת, קלה יותר לדעתי, היא לצייר ל Bitmap ולא ישירות למסך ואז ב Paint לצייר את ה bitmap עם DrawImage. אתה שומר Bitmap (כשדה במחלקה) ויוצר אותו במימדים של החלון.כשאתה מצייר את הצורות, אתה יוצר אובייקט Graphics עבור התמונה:Graphics gfx = Graphics.FromImage(this.drawingBmp);ומצייר אליו.באירוע Paint אתה מצייר את התמונה לחלון עם המתודה DrawImage (של Graphics). כדי לייעל את הציור אתה יכול לצייר רק את החלק בחלון שהשתנה. המאפיין ClipRectangle של PaintEventArgs מציין את המלבן שהשתנה. ה Paint שלך יהיה משהו בסגנון של: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { e.Graphics.DrawImage(this.drawingBmp, e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle, GraphicsUnit.Pixel); }לא הרצתי את הקוד אבל זה הרעיון בגדול.
פורסם 2007 באפריל 518 שנים מחבר אבל אני לא מחליט מה מצוייר, המשתמש שמצייר מחליט מה לצייר... ולשמור עם קובץ BMP כבר עשיתי אבל אני רוצה לראות אם יש דרך נורמלית יותר, כי לפתוח קובץ סתם לא נראה לי. למרות שתמיד אפשר לשמור אותו ב memory streamאבל איך אני שומר את כל הציור כאילו במשתנה ללא STREAM זאת השאלה
פורסם 2007 באפריל 518 שנים בטח שאתה יכול לדעת מה המשתמש מצייר לךהרי יש לך בטח אירועים על עכבר , תפריטי בחירה של צורות מוכנות מראש, וגם ציור חופשי עם העכבר במברשתלכל אלו יש פרמטרים נקודת התחלה, נקודת סיום, צבע , עובי מברשת כל אלו אתה יכול לשמור לתוך אוספים של אובייקטיםדרך אגב על גבי איזה משטח המשתמש מצייר בתכנית שלך , ישר על ה- form או שהקצת איזשהו container יעודי ?נראה לי שיותר נוח לתת למשתמש לצייר על גבי picture box כי יש לך יותר פיצ'רים שימושיים ליישום שלך
פורסם 2007 באפריל 518 שנים מחבר בטח שאתה יכול לדעת מה המשתמש מצייר לךהרי יש לך בטח אירועים על עכבר , תפריטי בחירה של צורות מוכנות מראש, וגם ציור חופשי עם העכבר במברשתלכל אלו יש פרמטרים נקודת התחלה, נקודת סיום, צבע , עובי מברשת כל אלו אתה יכול לשמור לתוך אוספים של אובייקטיםדרך אגב על גבי איזה משטח המשתמש מצייר בתכנית שלך , ישר על ה- form או שהקצת איזשהו container יעודי ?נראה לי שיותר נוח לתת למשתמש לצייר על גבי picture box כי יש לך יותר פיצ'רים שימושיים ליישום שלךאתה יכול לתת דוגמא איך אני אשמור את כל האובייקטים האלה ??? בשביל לצייר שוב את התמונה.דרך אגב זה רק לאימון שלי לא מוציא את זה לאף אחד.... (לגבי ה PICTURE BOX) ...תודה
פורסם 2007 באפריל 518 שנים אתה לא הבנת אותי. כשאמרתי bitmap לא התכוונתי לקובץ, אלא לאובייקט של המחלקה bitmap - תמונה בזכרון. התכוונתי שבמקום לצייר ישר לחלון, אתה מצייר לתמונה בזכרון (ל"אזור בזכרון") ואז מעתיק ממנו אל החלון כשצריך. תקרא קצת את התיעוד ב msdn.מה ש-NJorl הציע לך זה לשמור את הנתונים של כל צורה שהמשתמש מצייר. למשל, אתה יכול להגדיר מחלקה בשם Shape שיש לה את השדות Type, Top, Left, Width, Height, FillColor, PenWidth וכו'. אתה שומר אוסף (List למשל) של אובייקטים מטיפוס Shape שמציינים את הצורות שהמשתמש צייר. כשהמשתמש צייר עיגול למשל, אתה מוסיף לרשימה אובייקט חדש כשהשדה Type מוגדר כ "Circle" ושאר הנתונים על פי מה שהמשתמש צייר. ב Paint אתה עובר על הרשימה ומצייר את כל הצורות.
פורסם 2007 באפריל 518 שנים או קיי אתגרת אותי, בד"כ אני לא מתעסק בתכנות גרפיקה אבל סתם בשביל הפאןמסתבר שהבעיה שתארת כלל לא מופיעה אצלי , כנראה בשל העובדה שהשתמשתי ב- PictureBox בתור ה- Canvasבדוגמית שכתבתי היישומון מצייר קו מהרגע שאתה לוחץ על העכבר - זז איתו עד שאתה עוזבנסיתי אחה"כ להסתיר את החלון , למזער , הציור נשאר כמו גדולusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace WindowsApplication7{ public partial class Form1 : Form { bool isDrawing = false; private System.Drawing.Graphics g1 = null; private System.Drawing.Pen pen1 = null; private int x0 = -1; private int y0 = -1; public Form1() { InitializeComponent(); g1 = Graphics.FromImage(pictureBox1.Image); pen1 = new Pen(Color.Black, 1); } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { isDrawing = true; x0 = e.X; y0 = e.Y; } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { isDrawing = false; } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (isDrawing) { g1.DrawLine(pen1, x0, y0, e.X, e.Y); x0 = e.X; y0 = e.Y; pictureBox1.Refresh(); } } }}
פורסם 2007 באפריל 618 שנים זה באופן עקיף מה שהצעתי (רק שלא חשבתי להשתמש ב PictureBox). אתה מצייר לתמונה של ה PictureBox ולא ישירות לחלון. ה PictureBox מצייר את התמונה מחדש כשצריך.
פורסם 2007 באפריל 618 שנים ולכן , קבל ביטול לגבי ההצעות שהצעתי קודם לכן , זה היה נכון כנראה לגבי גרסאות של שפות יותר מיושנות כמו java 1.0 או רק אם אתה מתעקש לציירישירות לתוך החלון , אז כמו שאמרתי פשוט תשתמש ב- picture box ותחסוך קוד
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.