איך לדאוג שאובייקטים מצויירים לא יימחקו?? C# - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

איך לדאוג שאובייקטים מצויירים לא יימחקו?? C#


SaarD

Recommended Posts

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

קישור לתוכן
שתף באתרים אחרים

אתה אמור לעדכן את הציור שלך באירוע Paint של ה- control בתוכו את מצייר

אני יודע שיש טכניקה כדי לעדכן רק את החלק שהוסתר ע"י חלון אחר ע"מ ליעל את השיפור רק שאני לא זוכר איך זה הולך

במקרה הפחות יעיל פשוט תצייר את כל הציור מחדש

את ה- data של הציור אני מניח שאתה שומר באיזשהו Collection שמקבל אובייקטים שמממשים את הממשק של Draw

קישור לתוכן
שתף באתרים אחרים

הצייר שלי בעיקר משתמש במברשות, אז איך בדיוק אני "שומר" על הציור??....לא קיבלתי כאן איזושהי תשובה שמסבירה איך אני שומר על הציור כאשר הוא מוסתר או יוצא מגבולות המסך שלא יימחק

קישור לתוכן
שתף באתרים אחרים

קיבלת שני הסברים. אני אפרט קצת יותר.

בכל פעם שהחלון צריך לצייר את עצמו מחדש נקרא האירוע Paint של החלון. שולח הודעה לחלון לצייר את עצמו מחדש כשהסמן זז מעליו, כשחלק מהחלון הוסתר ואז "התגלה" מחדש וכו'. לכן הצורות שלך נמחקות - אתה לא מצייר אותן מחדש. אתה צריך להוסיף 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);
}

לא הרצתי את הקוד אבל זה הרעיון בגדול.

קישור לתוכן
שתף באתרים אחרים

אבל אני לא מחליט מה מצוייר, המשתמש שמצייר מחליט מה לצייר... ולשמור עם קובץ BMP כבר עשיתי אבל אני רוצה לראות אם יש דרך נורמלית יותר, כי לפתוח קובץ סתם לא נראה לי. למרות שתמיד אפשר לשמור אותו ב

memory stream

אבל איך אני שומר את כל הציור כאילו במשתנה ללא STREAM זאת השאלה

קישור לתוכן
שתף באתרים אחרים

בטח שאתה יכול לדעת מה המשתמש מצייר לך

הרי יש לך בטח אירועים על עכבר , תפריטי בחירה של צורות מוכנות מראש, וגם ציור חופשי עם העכבר במברשת

לכל אלו יש פרמטרים נקודת התחלה, נקודת סיום, צבע , עובי מברשת

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

דרך אגב על גבי איזה משטח המשתמש מצייר בתכנית שלך , ישר על ה- form או שהקצת איזשהו container יעודי ?

נראה לי שיותר נוח לתת למשתמש לצייר על גבי picture box כי יש לך יותר פיצ'רים שימושיים ליישום שלך

קישור לתוכן
שתף באתרים אחרים

בטח שאתה יכול לדעת מה המשתמש מצייר לך

הרי יש לך בטח אירועים על עכבר , תפריטי בחירה של צורות מוכנות מראש, וגם ציור חופשי עם העכבר במברשת

לכל אלו יש פרמטרים נקודת התחלה, נקודת סיום, צבע , עובי מברשת

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

דרך אגב על גבי איזה משטח המשתמש מצייר בתכנית שלך , ישר על ה- form או שהקצת איזשהו container יעודי ?

נראה לי שיותר נוח לתת למשתמש לצייר על גבי picture box כי יש לך יותר פיצ'רים שימושיים ליישום שלך

אתה יכול לתת דוגמא איך אני אשמור את כל האובייקטים האלה ??? בשביל לצייר שוב את התמונה.

דרך אגב זה רק לאימון שלי לא מוציא את זה לאף אחד.... (לגבי ה PICTURE BOX)

...

תודה

קישור לתוכן
שתף באתרים אחרים

אתה לא הבנת אותי. כשאמרתי bitmap לא התכוונתי לקובץ, אלא לאובייקט של המחלקה bitmap - תמונה בזכרון. התכוונתי שבמקום לצייר ישר לחלון, אתה מצייר לתמונה בזכרון (ל"אזור בזכרון") ואז מעתיק ממנו אל החלון כשצריך. תקרא קצת את התיעוד ב msdn.

מה ש-NJorl הציע לך זה לשמור את הנתונים של כל צורה שהמשתמש מצייר. למשל, אתה יכול להגדיר מחלקה בשם Shape שיש לה את השדות Type, Top, Left, Width, Height, FillColor, PenWidth וכו'. אתה שומר אוסף (List למשל) של אובייקטים מטיפוס Shape שמציינים את הצורות שהמשתמש צייר. כשהמשתמש צייר עיגול למשל, אתה מוסיף לרשימה אובייקט חדש כשהשדה Type מוגדר כ "Circle" ושאר הנתונים על פי מה שהמשתמש צייר. ב Paint אתה עובר על הרשימה ומצייר את כל הצורות.

קישור לתוכן
שתף באתרים אחרים

או קיי אתגרת אותי, בד"כ אני לא מתעסק בתכנות גרפיקה אבל סתם בשביל הפאן

מסתבר שהבעיה שתארת כלל לא מופיעה אצלי , כנראה בשל העובדה שהשתמשתי ב- 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();
}
}
}
}

קישור לתוכן
שתף באתרים אחרים

ולכן , קבל ביטול לגבי ההצעות שהצעתי קודם לכן , זה היה נכון כנראה לגבי גרסאות של שפות יותר מיושנות כמו java 1.0

או רק אם אתה מתעקש לציירישירות לתוך החלון , אז כמו שאמרתי פשוט תשתמש ב- picture box ותחסוך קוד

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...