PDA

View Full Version : حرفه ای: رسم مستطیل



royall
جمعه 04 بهمن 1392, 12:16 عصر
سلام
میخاستم با موس مستطیل رسم کنم طوری که تا موس پایینه
و حرکت میدیم موس رو مستطیل تییر کنه مثل paint که مستطیل میکشیم
و وقتی دست رو موس برداشتم ثابت بشه.با رخداد mouse move وقتی این کارو
میکنم فقط زمان حرکت مستطیل دیده میشه و اگه حرکت ندی دیده نمیشه.
سوال دوم اینکه چه طوری میشه توی پیکچرباکس که ابجکت گرافیک تعریف کردم
وقتی شکلی کشیدم مثلا دایره خواستم پاک کنم بدون اینکه عکس تو پیکچر باکس
رو دوباره جایگزسن کنم فقط شکلای رسم شده پاک بشه.
مرسی

rahnema1
جمعه 04 بهمن 1392, 14:51 عصر
سلام
وقتی شما برای پاک کردن از دستور clear استفاده می کنید در واقع دارید یک رنگ را به تمام پیکچرباکس اختصاص می دهید اما وقتی یک تصویر را به پیکچرباکس اختصاص می دهید رنگهای مختلف را به پیکسلهای اون اختصاص می دهید یعنی عملا فرقی نمی کنه چه اینکه پاک کنید و اینکه یک تصویر به اون اختصاص بدید


bool down=false;
Graphics gg;
Point pp = new Point();
Pen pn = new Pen(Color.Coral);
void MainFormLoad(object sender, EventArgs e)
{
pictureBox1.Left=0;
pictureBox1.Top=0;
gg=pictureBox1.CreateGraphics();
}
void PictureBox1MouseDown(object sender, MouseEventArgs e)
{
if (!down) pp=e.Location;
down=true;
}
void PictureBox1MouseMove(object sender, MouseEventArgs e)
{
if(down) {
gg.Clear(Color.FromKnownColor(KnownColor.Control)) ;
gg.DrawRectangle(pn,pp.X,pp.Y,e.Location.X-pp.X,e.Location.Y-pp.Y);
}
}
void PictureBox1MouseUp(object sender, MouseEventArgs e)
{
down=false;
}

royall
جمعه 04 بهمن 1392, 15:05 عصر
مرسی منم همین کارو کردم مشکل اینه که وقتی موس حرت میکنه مستطیل دیده میشه موس رو تکون ندی نشون نمیده .راهنمایی کنید.

rahnema1
جمعه 04 بهمن 1392, 18:51 عصر
ببینید حد اقل شما کدی که نوشتید را بذارید تا با توجه به مورد تذکرات لازم را بگیم
در هر صورت این برنامه را ببینید هم تصویر می کشه هم مستطیل

royall
جمعه 04 بهمن 1392, 21:00 عصر
ببینید حد اقل شما کدی که نوشتید را بذارید تا با توجه به مورد تذکرات لازم را بگیم
در هر صورت این برنامه را ببینید هم تصویر می کشه هم مستطیل
مرسی دوست من
چند تا سوال
عکس خالی دوم برای چی تعریف شده چون اگه تعریف نکنی هم میشه تو گرافیک رسم کرد

bm1=new Bitmap(pictureBox1.Width,pictureBox1.Height);

این دو تا خط رو هم توضیح بدین لطفا
pictureBox1.DrawToBitmap(bm1,pictureBox1.ClientRec tangle);


gg.DrawImage(bm1,-1,-1);

و سوال اخر اینکه چه طوری اینجا چه طوری مستطیل اپدیت میشه یعنی وقتی موس move تغییر میکنه مستطیل قبلی پاک بشه و مستطیل جدید رسم بشه.مرسی

rahnema1
جمعه 04 بهمن 1392, 23:12 عصر
مثلا شما فرض کنید عکس شما از پیکچرباکس بزرگتر باشه و شما هم مثلا عکس را stretch کردید و می خواهید روی این عکس stretch شده مستطیل بکشید در نتیجه عکس دوم یا bm1 را واسه این تعریف کردیم که عکس stretch شده را توی اون قرار بدیم در حالیکه عکس با سایز اصلی توی bm هست بنابراین سایز عکس دوم برابر با اندازه پیکچر باکسه نه اندازه عکس اصلی
DrawToBitmap هم عکس stretch شده را می ریزه توی bm1
DrawImage هم میاد قبل از رسم مستطیل اول bm1 را نشون می ده ما اینجا دیگه از clear استفاده نمی کنیم چون clear به همه پیکسلها یک رنگ را اختصاص میده و به جای اون DrawImage به کار میره که به هر نقطه رنگهای تصویر مورد نظر را اختصاص میده
اینکه چه طوری مستطیل جدید کشیده میشه خود کد باید به اندازه کافی گویا باشه. برای ترسیم مستطیل باید نقطه شروع ( گوشه بالا سمت چپ) و طول و عرض آن را داشته باشیم . وقتی که mousedown می شود نقطه شروع را به دست می آوریم و در نقطه pp می ذاریم از این به بعد تا زمانیکه mouseup نشده pp به عنوان نقطه شروع باقی خواهد ماند و طول و عرض مستطیل هم از موقعیت لحظه ای ماوس به دست میاد
با هر حرکت ماوس هم مرتبا هم عکس و هم مستطیل ترسیم میشن

royall
شنبه 05 بهمن 1392, 05:40 صبح
سلام مرسی بله میدونم مستطیل چه طوری رسم میشه منظورم اینه وقتی mousemove تغییر میکنه مستطیل قبلی باید پاک بشه و مستطیل جدید رسم بشه و تا زمانی که mouseup نشده این تکرار میشه ایاپدیت شدنن مستطیل چه طوریه؟
و این (bm1,-1,-1) نوشتین -1 ها یعنی چی؟

و ینpictureBox1.ClientRectangle یعنی چی؟

و سوال اخر اینکه بدون عکس خالی دوم میشه این کار رو کرد یا نه چون من روی autosize گذاشتم پیکچرباکس رو.مرسی

rahnema1
شنبه 05 بهمن 1392, 07:05 صبح
هر لحظه تصویر بر روی ترسیمات قبلی کشیده می شه در نتیجه هر چه در لحظه پیش کشیده بودیم پاک میشه و به جای اون یک تصویر به عنوان پس زمینه و یک مستطیل جدید هم روی اون رسم می شه که چون این خیلی خیلی سریع اتفاق می افته به نظر می رسه که سایز یک مستطیل داره تغییر می کنه در صورتی که این مستطیل که در یک لحظه مشاهده می کنیم اون مستطیل قبلی نیست که داشتیم در مثلا یک صدم ثانیه قبل نگاه می کردیم بلکه یک مستطیل جدیده که تنها نقطه شروع اون با مستطیل قبلی یکی هست و مستطیل قبلی دیگه پاک شده و از بین رفته
چون خصوصیت BorderStyle را به FixedSingle تغییر داده بودم لازم شد که 1- بذارم اگه None باشه اون را صفر بذاریم .
ببینید DrawImage واسه اینکه یک تصویر را بکشه حد اقل لازمه که هم تصویر و هم مختصات شروع تصویر را داشته باشه که اینجا چون مختصات شروع پیکچر باکس صفر بود صفر گذاشتیم راه حل دیگه اینه که به جای عدد مثل صفر و .. از pictureBox1.Location استفاده کنیم جهت اطلاع بیشتر راهنمای این متد را مطالعه کنید http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawimage(v=vs.110).aspx
DrawToBitmap هم لازمه اولا تصویری که قراره شکل ظاهری پیکچرباکس در اون ریخته بشه داشته باشیم و ثانیا اینکه چه قسمتی از اون تصویر باشه که توسط یک مستطیل مشخص میشه و چون ما می خواستیم کل پیکچرباکس را به تصویر دوم منتقل کنیم از ClientRectangle یا محدوده دربرگیرنده پیکچرباکس استفاده کردیم توضیحات کاملتر در راهنمای این متد هست: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.drawtobitmap(v=vs.110 ).aspx
اگه autosize باشه دیگه لازم نیست از تصویر دوم یا bm1 استفاده بشه مثلا در DrawImage به جای bm1 از bm استفاده کنید

royall
شنبه 05 بهمن 1392, 10:44 صبح
مرسی عالی بود فقط BorderStyle کجاست میشه بگین؟
ایا اموزش فارسی قسمت گرافیک سی شارپ هست ؟
مرسی

rahnema1
شنبه 05 بهمن 1392, 12:23 عصر
معمولا بعضی کنترل ها یک property به نام BorderStyle دارند که شما می تونید در قسمت properties اون را پیدا کنید. در مورد منبع فارسی اطلاع ندارم توی تالار یا اینترنت جستجو کنید در غیر اینصورت یک تاپیک با همین عنوان ایجاد کنید تا دوستانی که اطلاع دارند شما را راهنمایی کنند