بیایید تفاوت بین
Graphics g = this.CreateGraphics();
و
Graphics g = e.Graphics;
رو بهصورت کامل و با جزئیات بررسی کنیم و ببینیم هر کدوم تو چه شرایطی مناسبترن. این دو روش برای دسترسی به شیء Graphics توی Windows Forms استفاده میشن که ابزاری برای ترسیم اشکال، خطوط، متن و تصاویر روی فرم یا کنترلهاست. اما کاربرد و نحوه کارشون با هم فرق داره.
Graphics g = this.CreateGraphics();
توضیح:
این خط یه شیء Graphics جدید رو مستقیماً از فرم یا هر کنترل دیگهای که this بهش اشاره میکنه ایجاد میکنه.
CreateGraphics()
یه متد از کلاس Control هست که هر بار که فراخوانی میشه، یه نمونه تازه از Graphics میسازه و به شما اجازه میده روی سطح فرم چیزی ترسیم کنید.
این شیء به رویدادهای ترسیم سیستم مثل Paint وابسته نیست ( ما وابسته نیستیم)و شما خودتون کنترلش میکنید.
نحوه کار:
وقتی از
CreateGraphics()
استفاده میکنید، ترسیمهایی که انجام میدید موقتی هستن. یعنی اگه فرم نیاز به بازنقاشی پیدا کنه مثلاً وقتی پنجره رو جابهجا میکنید، کوچکش میکنید، یا یه پنجره دیگه روش رو میپوشونه و بعد کنار میره ، چیزایی که با این روش کشیدید پاک میشن، چون این ترسیمها توی حافظه دائمی رندر فرم ذخیره نمیشن. برای نگه داشتن ترسیمها، باید هر بار که فرم بازنقاشی میشه، خودتون دوباره کد ترسیم رو اجرا کنید.
مثال:
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
g.DrawRectangle(new Pen(Color.Red), 10, 10, 100, 50);
}
اینجا با کلیک روی دکمه، یه مستطیل قرمز کشیده میشه. ولی اگه فرم رو minimize کنید و دوباره برگردونید، مستطیل غیبش میزنه!
پس این روش مناسب چه شرایطی است ؟
ترسیمهای موقتی و فوری: مثلاً وقتی میخواهید یه پیشنمایش سریع (مثل یه خط یا شکل) نشون بدید که نیازی به دائمی بودنش نیست.
ترسیم در پاسخ به رویدادهای کاربر: مثل وقتی که کاربر با ماوس چیزی میکشه و شما فقط میخواهید همون لحظه نشونش بدید (مثل یه برنامه نقاشی ساده).
کنترل دستی: وقتی نمیخواهید به سیستم بازنقاشی فرم وابسته باشید و خودتون میخواهید زمان و مکان ترسیم رو مدیریت کنید.
معایب:
عدم پایداری: ترسیمها با هر بازنقاشی فرم پاک میشن، مگه اینکه خودتون توی رویداد Paint دوباره بکشیدشون.
مصرف منابع: هر بار که CreateGraphics() رو صدا میزنید، یه شیء جدید ساخته میشه که اگه زیاد استفاده بشه، میتونه عملکرد رو پایین بیاره.
نیاز به مدیریت دستی: باید خودتون حواستون باشه که شیء Graphics رو با Dispose() آزاد کنید( اگه خارج از Paint استفاده میکنید)، وگرنه ممکنه مشکل حافظه پیش بیاد.
Graphics g = e.Graphics;
توضیح:
این خط از شیء Graphicsای استفاده میکنه که توسط سیستم توی رویداد Paint یا رویدادهای مشابه مثل OnPaint به شما داده شده.
e یه آرگومان از نوع PaintEventArgs هست که شامل اطلاعات ترسیم (مثل ناحیهای که باید بازنقاشی بشه) و یه نمونه آماده از Graphics است.
این شیء به سیستم رندرینگ فرم وصله و بخشی از فرآیند بازنقاشی ویندوزه.
نحوه کار:
وقتی از e.Graphics استفاده میکنید، ترسیمهاتون بهصورت خودکار با چرخه بازنقاشی فرم هماهنگ میشن. یعنی هر وقت فرم نیاز به ترسیم دوباره داشته باشه (مثلاً بعد از تغییر اندازه یا باز شدن)، کد توی Paint دوباره اجرا میشه و اشکال شما حفظ میشن.
سیستم خودش مدیریت منابع رو انجام میده و نیازی نیست شما Dispose() کنید، چون e.Graphics توسط رویداد کنترل میشه.
مثال:
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawRectangle(new Pen(Color.Red), 10, 10, 100, 50);
}
اینجا مستطیل قرمز هر بار که فرم بازنقاشی میشه کشیده میشه و پاک نمیشه، چون به رویداد Paint وصل شده.
این روش مناسب چه شرایطی است ؟
ترسیمهای دائمی: وقتی میخواهید چیزی رو روی فرم بکشید که همیشه دیده بشه، مثل کادرها، نمودارها یا آیکنها.
طراحی رابط کاربری: برای عناصر گرافیکی که بخشی از ظاهر فرم هستن و باید با تغییرات فرم مثل resize هماهنگ بمونن.
بهینهسازی: چون از سیستم بازنقاشی ویندوز استفاده میکنه، بهینهتره و نیازی به مدیریت دستی منابع نداره.
معایب:
وابستگی به رویداد: فقط توی رویداد Paint یا OnPaint میتونید ازش استفاده کنید و نمیتونید خارج از این رویداد بهش دسترسی داشته باشید.
عدم انعطاف برای ترسیم لحظهای: برای ترسیمهای سریع و موقتی (مثل واکنش به کلیک ماوس) باید یه راه دیگه پیدا کنید یا با Invalidate() رویداد Paint رو دستی فراخوانی کنید.
تفاوتهای کلیدی
ویژگی this.CreateGraphics() e.Graphics
منبع مستقیماً از فرم یا کنترل ساخته میشه از رویداد Paint تأمین میشه
پایداری ترسیم موقتی (با بازنقاشی پاک میشه) دائمی (با هر بازنقاشی تکرار میشه)
محل استفاده هر جایی (مثل رویدادهای کلیک) فقط توی رویداد Paint
مدیریت منابع نیاز به Dispose() داره اگه دستی باشه خودکار توسط سیستم مدیریت میشه
بهینهسازی کمتر بهینه (ایجاد شیء جدید هر بار) بهینهتر (استفاده از سیستم رندر)