PDA

View Full Version : پاک کردن یک شکل رسم شده از بین چند شکل



alasht
جمعه 04 آذر 1390, 12:02 عصر
با سلام خدمت دوستان
فرض کنید با این کد چند تا شکل تو فرم رسم کردیم
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Red, 2);
g.DrawEllipse(p, 100, 100, 50, 50);
g.DrawRectangle(p, 200, 200, 50, 50);
g.DrawRectangle(p, 300, 300, 50, 100);
با این کد تو فرم سه تا شکل (مربع و مستطیل و دایره ) رسم میشه حالا میخوام کاری کنم که وقتی رو دایره کلیک شد دایره پاک بشه بدون اینکه کل فرم پاک بشه
برای پاک کردن کل شکلها از این دستور استفاده میکنم
g.Clear(Color.FromKnownColor(KnownColor.Control));
اما برای پاک کردن یک شکل خاص باید چیکار کنم ؟

zarrinnegar
جمعه 04 آذر 1390, 14:26 عصر
من از گرافیک توی برنامه نوسی زیاد سر رشته ندارم ولی یه راهنمایی میتونم بکنم

شما وقتی از برنامه Paint ویندوز استفاده میکنی اگه از ابزار هاش استفاده کنی باز هم میبینی همین طوره ولی وقتی از فتوشاپ استفاده میکنی برای هر ترسیم یک لایه درست میکنه
شما هم باید کاری کنی که لایه های مختلفی با هر ترسیم درست بشه و اگه روی یک شکل کلیک کردی اون لایه قابل تشخیص باشه و بعد بگی اون لایه پاک بشه

alasht
جمعه 04 آذر 1390, 16:47 عصر
با تشکر از پاسخ شما
روش درسته باید لایه بندی بشه
اینو میدونم که باید لایه بندی بشه ولی مهم اجراشه که چطور لایه بندی کنم و چطور شی انتخاب شده رو پاک کنم

ArashRoshan
جمعه 04 آذر 1390, 17:56 عصر
سلام ، به نظر من برای هر شکل یک کلاس Graphics تعریف کن . یعنی Circle as Graphics بعد دایره و رسم کن ، Rectangle as Graphics بعد یک مستطیل ، و ...

alasht
جمعه 04 آذر 1390, 17:58 عصر
نه نمیشه چون تعدادش مشخص نیست شاید کاربر بخواد 100 تا دایره رسم کنه و از بین این 100 تا دایره یکیش رو بخواد پاک کنه

haniyehghassami
جمعه 04 آذر 1390, 18:10 عصر
سلام
نمیدونم این راه مفید باشه یا نه اما خوب بهتر از هیچیه!
به نظر من هرکدام از این اشکال اگه درون یک پنل ایجاد بشن مثل این لایه ها میشن پس توی رویداد کلیکشون میتونین بنویسین که کل پنل خالی بشه از اشکال گرافیکی (البته اگه پنل ها جدا از هم باشند شاید این شیوه جواب بده)

alasht
جمعه 04 آذر 1390, 18:30 عصر
از این راه میشه و راحت هم میشه روش هر کاری کرد ولی میخوام فقط میخوام فرم برد نقاشیم بشه و اعمال رو اون انجام بشه

exlord
جمعه 04 آذر 1390, 19:10 عصر
یک کلاس درست کن به اسم shape و مشخصات اشکالی رو که میخوای رسم کنی ( نقطه شروع و نقطه پایلن و طول و عرض و رنگ و z-index ... ) ، توی یه لیست از این کلاس نگه دار ....
توی اونت painting مربوط به فرم یا پنلی که توش draw میکنی ... با یه حلقه اشیای توی این لیست رو رسم کن ...
حالا میتونی هر کدوم از این اشکال رو از لیست حذف کنی و متد Invalidate() مربوطه رو صدا کنی تا فرم رو RePaint کنه ...

exlord
جمعه 04 آذر 1390, 21:05 عصر
vs نداشتم با np++ «وشتم ممکنه اشکال املایی داشته باشه ...

public class shape
{
public Point XY;
public Size s_size;

public void Paint(Graphics g)
{
g.DrawEclipse(....);
}

}

public class form1:form
{
public List<shape> shapes = new List<shape>();


shapes.add(new shape(){XY = new Point(...),s_size=new Size(...)})
shapes.add(new shape(){XY = new Point(...),s_size=new Size(...)})
shapes.add(new shape(){XY = new Point(...),s_size=new Size(...)})
shapes.add(new shape(){XY = new Point(...),s_size=new Size(...)})
.
.
.

//event OnPaint
form1_OnPaint(PaintEventArgs e)
{
foreach(shapes as s)
{
s.Paint(e.graphics);
}
}


public void Remove(int index)
{
shapes.RemoveAt(index);
form1.Invalidate();
}
}