PDA

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



omidrajabitiz
یک شنبه 12 خرداد 1392, 10:13 صبح
با سلام خدمت دوستان

در شکل زیر یک مستطیل بر روی یک splitContainer و بر روی یکی از panel ها رسم شده است.
اما مشکل اینجاست که زمانی که فرم در حالت ماکسیمم قرار می گیرد یا آن را بزرگ می کنیم و یا زمانی که spliter را تغییر می دهیم مستطیل کلا پاک می شود.

البته این مشکل زمانی که مستطیل بر روی فرم یا بر روی یک پنل نیز رسم شده است نیز وجود دارد.

از دوستان کسی میتونه کمک کنه!

ASKaffash
یک شنبه 12 خرداد 1392, 12:30 عصر
سلام
در چه Event ای ترسیم انجام می شود ؟

omidrajabitiz
یک شنبه 12 خرداد 1392, 16:04 عصر
سلام
در چه Event ای ترسیم انجام می شود ؟

در رویداد کلیک یک button !
فکر نمی کنم ارتباطی با این رویداد داشته باشه!
مثلا کد زیر که در رویداد یک button قرار داده بشه! یک مستطیل بر روی فرم ایجاد میکنه!

System.Drawing.Graphics graphic;
graphic = this.CreateGraphics();
Pen pen1 = new Pen(System.Drawing.Color.Red, 1);
Rectangle rect = new Rectangle(20, 20, 250, 200);
graphic.DrawRectangle(pen1, rect);




یا این کد که مستطیلی رو روی panel1 رسم میکنه!


System.Drawing.Graphics graphic;
graphic = this.panel1.CreateGraphics();
Pen pen1 = new Pen(System.Drawing.Color.Red, 1);
Rectangle rect = new Rectangle(20, 20, 250, 200);
graphic.DrawRectangle(pen1, rect);


در این دو مورد اگه فرم رو کوچک کنیم به نحوی که مقداری از مستطیل محو شود و دوباره فرم رو بزرگ کنیم، مقداری از مستطیل که محو می شود دیگه برگدانده نمی شه!

حالا اگه همین مستطیل بر روی یک splitContainer و بر روی یکی از panel ها رسم شود با کوچکترین تغییری در فرم یا یکی از panelها شکل کاملا از بین میره!

فکر می کنم مشکل از یکی از خاصیت های فرم یا پنل باشه که من پیداش نکردم:ناراحت:

tooraj_azizi_1035
یک شنبه 12 خرداد 1392, 16:11 عصر
در رویداد OnPaint فرمتون دوباره باید عمل ترسیم رو انجام بدید. و اگه داخل splitContainer رسم انجام شده در رویداد اون هم باید این کار رو بکنید.
سعی کنید عمل ترسیم رو در یک متد نوشته و اون رو در رویداد گفته شده فراخوانی کنید.

omidrajabitiz
یک شنبه 12 خرداد 1392, 16:55 عصر
در رویداد OnPaint فرمتون دوباره باید عمل ترسیم رو انجام بدید. و اگه داخل splitContainer رسم انجام شده در رویداد اون هم باید این کار رو بکنید.
سعی کنید عمل ترسیم رو در یک متد نوشته و اون رو در رویداد گفته شده فراخوانی کنید.

ممنون از راهنمایی تون، مفید بود.
حالا مشکل اینجاست که نمودار یا شکل با توجه به داده هایی که از کاربر گرفته میشه رسم میشه!
و نمیدونم که چطوری داده ها رو به این رویداد بفرستم و بعدش هم از داخل رویداد، به متد فرستاده بشه تا رسم بشه!

tooraj_azizi_1035
یک شنبه 12 خرداد 1392, 16:57 عصر
خود متدی که عمل ترسیم رو انجام میده باید پارامترهایی رو بگیره و این پارامترها در هنگام فراخوانی مقادیرشون تغذیه میشه.

ASKaffash
دوشنبه 13 خرداد 1392, 07:01 صبح
سلام
نه تنها Event بنام OnPaint را باید override کنید بلکه باید برای OnResize هم متد Refresh را Call کنید

در رویداد کلیک یک button !
فکر نمی کنم ارتباطی با این رویداد داشته باشه!

omidrajabitiz
دوشنبه 13 خرداد 1392, 10:17 صبح
خود متدی که عمل ترسیم رو انجام میده باید پارامترهایی رو بگیره و این پارامترها در هنگام فراخوانی مقادیرشون تغذیه میشه.

این کار رو انجام دادم! حالا مشکل اینه که وقتی ترسیم با توجه به داده های جدید انجام میشه، ترسیم های قبلی بر روی فرم یا پنل تا زمانی که فرم مینینمم و ماکسیمم نشود باقی می مونه!
من برای رفع این مشکل بعد از به روز آوری شکل رسم شده از کد زیر برای پاک شدن شکل قبلی استفاده کردم که خیلی غیر استاندارده! :افسرده:

this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Normal;

tooraj_azizi_1035
دوشنبه 13 خرداد 1392, 10:27 صبح
وقتی متد مربوط به ترسیم فقط در زمان لازم اجرا شود (OnPaint) یعنی زمانی که شکل قبلی پاک شد، نیازی به پاک کردن شکل قبلی نیست چون خودش پاک شده.

omidrajabitiz
دوشنبه 13 خرداد 1392, 10:36 صبح
ممنون از کمک دوستان

مشکلم حل شد:لبخندساده:
کد رو کذاشتم اگه کسی احتیاج داشت استفاده کنه!
برای اینکه مشکل پاک شدن شکل قبلی حل بشه من یکی از ابعاد شکل رسم شده رو از یک تکست باکس میگیرم تا کد از این لحاظ هم تست شود


private void Form2_Paint(object sender, PaintEventArgs e)
{
if (this.bolMyPaint == true)
this.MyPaint();
}



private void MyPaint()
{
System.Drawing.Graphics graphic;
graphic = this.CreateGraphics();

graphic.Clear(Color.FromKnownColor(KnownColor.Cont rol));//Clear the last draw
Pen pen1 = new Pen(System.Drawing.Color.Red, 1);
Rectangle rect = new Rectangle(20, 20, int.Parse(textBox1.Text), 200);
graphic.DrawRectangle(pen1, rect);

graphic.Dispose();
}






private bool bolMyPaint;
private void button1_Click(object sender, EventArgs e)
{
this.MyPaint();
this.bolMyPaint = true;
}