PDA

View Full Version : فراخوانی رویداد Paint در رویداد کلیک روی Button



puvinax
دوشنبه 09 فروردین 1389, 00:11 صبح
سلام

ببخشید می خواستم بدونم ممکنه که من بتونم تو سی شارپ کد موجود در بخش رویداد Paint کنترل PictureBox را با هر بار کلیک روی Button (منظورم رویداد کلیک روی Button هست) را فراخوانی و اجرا کنم ؟ [ یعنی در کل می خوام با هر بار کلیک کد درون رویداد Paint کنترل PictureBox را فراخوانی کنم].

ممنون میشم کمک کنید و کد مربوطه رو برایم بگذارید.
ممنون.

مهدی رحیم زاده
دوشنبه 09 فروردین 1389, 00:19 صبح
میشه واضح تر توضیح بدین که چکار می خوایین انجام بدین؟

alireza_s_84
دوشنبه 09 فروردین 1389, 00:46 صبح
سلام

ببخشید می خواستم بدونم ممکنه که من بتونم تو سی شارپ کد موجود در بخش رویداد Paint کنترل PictureBox را با هر بار کلیک روی Button (منظورم رویداد کلیک روی Button هست) را فراخوانی و اجرا کنم ؟ [ یعنی در کل می خوام با هر بار کلیک کد درون رویداد Paint کنترل PictureBox را فراخوانی کنم].

ممنون میشم کمک کنید و کد مربوطه رو برایم بگذارید.
ممنون.
سلام دوست عزیز:


private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Blue, e.ClipRectangle);
}

private void button1_Click(object sender, EventArgs e)
{
pictureBox1_Paint(pictureBox1, new PaintEventArgs(pictureBox1.CreateGraphics(), pictureBox1.ClientRectangle));
}

ولی هرچی فکر کردم دیدم چه کاره بیخودیه!!!
لطفا ایده تو از انجام این کار هم قرار بده برای من جالبه
موفق باشید

mehdi.mousavi
دوشنبه 09 فروردین 1389, 00:52 صبح
سلام

ببخشید می خواستم بدونم ممکنه که من بتونم تو سی شارپ کد موجود در بخش رویداد Paint کنترل PictureBox را با هر بار کلیک روی Button (منظورم رویداد کلیک روی Button هست) را فراخوانی و اجرا کنم ؟ [ یعنی در کل می خوام با هر بار کلیک کد درون رویداد Paint کنترل PictureBox را فراخوانی کنم].

ممنون میشم کمک کنید و کد مربوطه رو برایم بگذارید.
ممنون.

سلام.
کافیه روی PictureBox خودتون، Refresh رو فراخوانی کنید تا دوباره Paint فراخوانی بشه. PictureBox از Control مشتق میشه، و روی کنترل متود Refresh قرار داره، که باعث Invalidate شدن کنترل مورد نظر میشه.

موفق باشید.

puvinax
دوشنبه 09 فروردین 1389, 09:17 صبح
سلام.
کافیه روی PictureBox خودتون، Refresh رو فراخوانی کنید تا دوباره Paint فراخوانی بشه. PictureBox از Control مشتق میشه، و روی کنترل متود Refresh قرار داره، که باعث Invalidate شدن کنترل مورد نظر میشه.

موفق باشید.

اجازه بدید بیشتر توضیح بدم چون هنوز یک مشکل هست ببینید من دو تا گره با براش ها توی picturebox ترسیم کردم حالا می خوام فلشی از گره اول به دوم بکشم.
چون در هنگام رسم فلش از کد Graphics g2 = e.Graphics بهره می برم که باید تو رویداد paint باشه چرا که به آرگومان PaintEventArgs e نیاز هستش. پس من مجبورم برای رسم فلش با کلیک بر روی دکمه ای این دستور رو بدم اما باید رویداد Paint رو فراخونی کنم.
دوست عزیز آقای mehdi.mousavi
ممنون از کمکت اما با Refresh کردن هر آنچه که دارم پاک میشه و سپس Arrow رسم میشه من نمی خوام چیری پاک بشه.

ممنون اگر راه حل تازه ای به ذهن دوستان رسید ممنون میشم کمکم کنه.

puvinax
دوشنبه 09 فروردین 1389, 09:22 صبح
سلام دوست عزیز:


private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Blue, e.ClipRectangle);
}

private void button1_Click(object sender, EventArgs e)
{
pictureBox1_Paint(pictureBox1, new PaintEventArgs(pictureBox1.CreateGraphics(), pictureBox1.ClientRectangle));
}
ولی هرچی فکر کردم دیدم چه کاره بیخودیه!!!
لطفا ایده تو از انجام این کار هم قرار بده برای من جالبه
موفق باشید

سلام

ممنون از کمکت من دقیقا همین منظورم بود اما مثل راه حل دوست دیگرمون در پست بالا این مورد هم باعث پاک شدن picturebox میشه که من نمیدونم راه حلش چیه. من نمیخوام هیچ چیزی از محتویات picturebox پاک بشه در عین حال ترسیم Arrow هم صورت بگیره.
فرمودید توضیح بدم که در پست بالا اندکی گفتم امیدوارم جامع و کافی باشه.

اگر راه حلی به ذهنتون رسید ممنون میشم راهنمایی کنید.

ASKaffash
دوشنبه 09 فروردین 1389, 09:55 صبح
سلام
همانطور که در پست 4 گفته شده Refresh روی PictureBox همان رویداد Paint را فراخوانی میکند و وقتی شما از کلاس Graphics استفاده میکنید نمی توانید نصف ترسیم را یکبار و نصف دیگر را یکبار دیگر انجام دهید اگر مقادیر قبلی ترسیمات برای شما مهم است یک آرایه ای از اشیای ترسیم شده را نگهداری ودر ترسیمات بعدی استفاده نمائید

exlord
دوشنبه 09 فروردین 1389, 10:03 صبح
Point p1 = new Point(10, 10);
Point p2 = new Point(10, 10);
private void button1_Click(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
Pen p = new Pen(Color.Black);
p2.X += 5;
g.DrawLine(p, p1, p2);
}

mn_zandy63
دوشنبه 09 فروردین 1389, 11:11 صبح
همونطور که دوستمون exlord در کدی که گذاشتند اشاره کردند.
لازم نیست حتما به رویداد paint برسی تا به Graphics دسترسی داشته باشی. کافیه از متد picturebox1.CreateGraphics استفاده کنی. به همون شی که دنبالشی دسترسی داری.
موفق باشی.

SMRAH1
دوشنبه 09 فروردین 1389, 12:36 عصر
سلام
با توجه به کار کرد شما،توصیه می کنم که به جای رسم مستقیم در یک کنترل (حتی اگر PicturBox باشد)،یک Bitmap آیجاد کرده و در آن رسم کنید و سپس Bitmap را به PicturBox تخصیص دهید (این روش اصولی تر است)!

Point p1 = new Point(10, 10);
Point p2 = new Point(10, 10);
private void button1_Click(object sender, EventArgs e)
{
using(Graphics g = Graphics.FromImage(bmp))
{
Pen p = new Pen(Color.Black);
p2.X += 5;
g.DrawLine(p, p1, p2);
}
pictureBox1.Image = bmp;
}
موفق باشید

ASKaffash
سه شنبه 10 فروردین 1389, 08:09 صبح
Point p1 = new Point(10, 10);
Point p2 = new Point(10, 10);
private void button1_Click(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
Pen p = new Pen(Color.Black);
p2.X += 5;
g.DrawLine(p, p1, p2);
}


سلام
این روش اشکال فنی دارد وقتی یک فرم روی این PictureBox بازشود کلیه ترسیمات از بین میرود و حتما باید از Paint استفاده گردد خودتان چیزی را که گفتم تست کنید خواهید دید