PDA

View Full Version : سوال: مشکل در رسم اشکال؟



H_vakilian
شنبه 23 آذر 1387, 01:45 صبح
من یک PictureBox دارم که میخوام مثل صفحه رسم اشکال در Paint رفتار کنه.
کدش اینجاست
با این کدی که من نوشتم ملومه که وقتی شکل دوم رو می خوام بکشم اگه رو شکل اول قرار بگیره مقداری از اون رو پاک مکنه این مشکل رو چطور حل کنم
با هر بار اتفاق افتادن رویداد MouseMove (در صورتی که دکمه موس پایین باشد)یک مستطیل رسم مشه که اگه ادامه داشته با یک مستطیل سفید پاک میشه(مشکل همین مستطیل سفید هستش که شکلهای زیری رو نیز غیر از مستطیل قبلی پاک می کنه)
در ضمن چطور می تونم این صفحه رو بریزم تو یک Bitmap


private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (Bool_MuoseStatus)
{
Pen_Main = new Pen(Color.White , 1);
GraphicRectangle MyRectangle = new GraphicRectangle(true, pictureBox1, Pen_Main, Rec_Main.Location, Rec_Main.Width, Rec_Main.Height);
Pen_Main.Color = colorDialog1.Color;
GraphicRectangle MyRectangle1 = new GraphicRectangle(true, pictureBox1 , Pen_Main , Point_StartPoint , Control.MousePosition.X - Int_MousePositionX , Control.MousePosition.Y - Int_MousePositionY );
Rec_Main.Location = Point_StartPoint;
Rec_Main.Width = Control.MousePosition.X - Int_MousePositionX ;
Rec_Main.Height = Control.MousePosition.Y - Int_MousePositionY ;
//.i);
}
}


private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
Bool_MuoseStatus = true;
Point_StartPoint = new Point();
Point_StartPoint=MousePositionOnControl();
Int_MousePositionX = Control.MousePosition.X;
Int_MousePositionY = Control.MousePosition.Y;
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
Bool_MuoseStatus = false;
Rec_Main.Location = new Point(0, 0);
Rec_Main.Width = 0;
Rec_Main.Height = 0;

}

مهدی رحیم زاده
شنبه 23 آذر 1387, 06:30 صبح
این نمونه برنامه رو نگاه کن از همین سایت گرفتمش .

shask00l
شنبه 23 آذر 1387, 11:42 صبح
من قدیما این کار رو با c انجام داده بودم . البته سیستم ذخیره سازی اون برنامه برداری بود و میشد نصویر رو refresh کرد . برای حل مشکل حذف شدن بخشی از تصویر موقع رسم هم . وقتی کاربر ماوس رو حرکت میداد برنامه تصویر زیر اون منطقه رو ذخیره میکرد . فکر میکنم این جواب بده .
امیدوارم منظورتونو درست متوجه شده باشم .

مهدی رحیم زاده
شنبه 23 آذر 1387, 14:13 عصر
اگه توی ایونت Paint بکشید پاک نمیشن

SMRAH1
یک شنبه 24 آذر 1387, 14:36 عصر
به طور کلی وقتی شکلی را در متد paint طراحی کند،ویندوز تا مجبور به رسم دوباره اون نشه،اون ترسیم رو تایید شده و مدنظر برنامه فرض می کنه.به همین دلیل اگر مثلا در متد paint سطح کنترل یا فرم رو مثلا قرمز کنی بعد دریک متد دیگه همین سطح رو آبی کنی،اگر ویندوز به دلیل قرار گرفتن یک پنجره دیگه روی فرم یا کنترل مورد نظر ما،مجبور به رسم دوباره اون بشه،از عکسی که توسط متد paint کشیده شده استفاده می کنه و در نتیجه فرم قرمز میشه.
برای حل این مشکل هرجا نیاز به باز طراحی فرم است،باید درخواست رسم مجدد توسط دستور Invalidate کنترل یا فرم رو داشته باشی و طراحی مناسب را به متد OnPaint (که میتونی باز نویسی کنید) بسپاری.

موفق باشید

H_vakilian
یک شنبه 24 آذر 1387, 21:42 عصر
من مشکلم اینکه شکل جدید که رسم میشه یه مقداری از قبلی رو پاک می کند نه اینکه وقتی رویدار Paint فرم فراخوانی می شود.
من شکلم رو داخل یک Bitmap می کشم و در PictureBox نمایشش میدم پس از لحاظ رویداد Paint مشکلی واسش پیش نمیاد

SMRAH1
دوشنبه 25 آذر 1387, 10:30 صبح
اگر ممکنه یک نمونه کد (پروژه) بگذارید تا بشه بهتر روش بحث کرد.

H_vakilian
دوشنبه 25 آذر 1387, 12:51 عصر
اینم کدهاست
GraphicRectangle یک کلاس هستش که تو constractor مقادیری رو که می بینید می گیرم و رو bitmap رسمش می کنم
CorrectRectangle هم یک تابع هستش که X,Y نقطه ای رو که رویداد MouseDown اتفاق افتاده رو می گیرد که دو پارامتر اول تابع هستش و همچنین X,Y نقطه ای که در حال حاضر موس قرار دارد که با MouseMove تغییر می کند که پارامترهای سوم و چهارم تابع هستش
این تابع نحوه رسم درست مستطیل رو در چهار قسمت محور مقتصات به صورت یک مستطیل بر می گردونه.
مشکل در خط 6و7 هستش که باعث میشه اگه زیر شکلی که می خواهیم بکشیم یه شکل دیگه باشه مقداری از شکل زیری پاک میشه:گریه:



private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (Bool_MuoseStatus)
{
pictureBox1.Image = bmp_image;
Pen_Main = new Pen(pictureBox1.BackColor , 1);
GraphicRectangle MyRectangle = new GraphicRectangle(true, bmp_image, Pen_Main, Rec_Main);
Pen_Main.Color = colorDialog1.Color;
Rec_Main=CorrectRectangle(Int_MousePositionX, Int_MousePositionY, Control.MousePosition.X, Control.MousePosition.Y);
GraphicRectangle MyRectangle1 = new GraphicRectangle(true, bmp_image, Pen_Main,Rec_Main );

}
}