bitaroos
Member
[FONT="]سلام [/FONT]
[FONT="]اگه دوست دارید یه برنامه شبیه [/FONT][FONT="]Photoshop[/FONT][FONT="] بنویسید ( البته اگه خدا حال و حوصله بده) توچند قسمت می خوام اینکارو براتون بکنم[/FONT]
[FONT="]در اینجا یه قسمت از [/FONT][FONT="]toolbox[/FONT][FONT="] برنامه ی [/FONT][FONT="]Photoshop[/FONT][FONT="] رو یاد دادم البته اکسرش ترجمه ی کتاب زیره[/FONT]
[FONT="]Graphics Programming with GDI+
[/FONT]
[/FONT]
[FONT="]البته برای فهم این آموزشی که دادم باید یکمی [/FONT][FONT="]GDI+[/FONT][FONT="] بلد باشید
[/FONT]
[/FONT]
[FONT="]قسمت های بعدی [/FONT][FONT="]color piker & filters & color box & cropping & resizing & typing on image & image rotation & zooming & flipping & ….[/FONT]
[FONT="]پس منتظر باشید البته اگه خدا حال و حوصله بده
[/FONT]
[/FONT]
[FONT="]بعد از باز کردن [/FONT][FONT="]c#[/FONT][FONT="] و ایجاد پروژه از نوع [/FONT][FONT="]Windows Forms Application[/FONT][FONT="] روی فورم ایجاد شده دابل کلیک کنید تا وارد رویداد [/FONT][FONT="]load[/FONT][FONT="] این فورم بشیم[/FONT]
[FONT="]FFFFFFFFFFFFFFFFFFFF[/FONT][FONT="]private[/FONT][FONT="] void Form1_Load(object sender, EventArgs e)[/FONT]
[FONT="] {[/FONT]
[FONT="]XXXXXXXXXXXXXXX[/FONT]
[FONT="] }[/FONT]
[FONT="]
حال قبل از وارد کردن کد های این رویداد، کد های زیر را در بالای[/FONT][FONT="]private[/FONT][FONT="] void Form1…[/FONT][FONT="] یعنی بجای [/FONT][FONT="]FFFFFFFFFFFFFFFFFFFF[/FONT][FONT="]وارد میکنیم[/FONT]
حال قبل از وارد کردن کد های این رویداد، کد های زیر را در بالای[/FONT][FONT="]private[/FONT][FONT="] void Form1…[/FONT][FONT="] یعنی بجای [/FONT][FONT="]FFFFFFFFFFFFFFFFFFFF[/FONT][FONT="]وارد میکنیم[/FONT]
[FONT="]این کد ها متغیر هایی هستند که در طول برنامه ازشون استفاده میشه
[/FONT]
[/FONT]
HTML:
private Bitmap bitmap = null;
private Bitmap curBitmap = null;
private bool dragMode = false;
private int drawIndex = 1;
private int curX, curY, x, y;
private int diffX, diffY;
private Graphics curGraphics;
private Pen curPen;
private SolidBrush curBrush;
private Size fullSize;
private Color curcolor = Color.Black;
حال کد های رویداد [/FONT][FONT="]load[/FONT][FONT="] را بین { } بجای [/FONT][FONT="]XXXXXXXXXXXXXXX[/FONT][FONT="] وارد میکنیم[/FONT]
HTML:
private void Form1_Load(object sender, EventArgs e)
{
// Get the full size of the form
fullSize = SystemInformation.PrimaryMonitorMaximizedWindowSize;
// Create a bitmap using full size
bitmap = new Bitmap(fullSize.Width,fullSize.Height);
// Create a Graphics object from Bitmap
curGraphics = Graphics.FromImage(bitmap);
// Set background color as form's color
curGraphics.Clear(this.BackColor);
// Create a new pen and brush as
// default pen and brush
curPen = new Pen(curcolor);
curBrush = new SolidBrush(curcolor);
}
[FONT="]
کد زیر اندازه ی پنجره را در [/FONT][FONT="]متغیر [/FONT][FONT="]fullSize[/FONT][FONT="] ذخیره می کند[/FONT]
[FONT="] fullSize = SystemInformation.PrimaryMonitorMaximizedWindowSize;[/FONT]کد زیر اندازه ی پنجره را در [/FONT][FONT="]متغیر [/FONT][FONT="]fullSize[/FONT][FONT="] ذخیره می کند[/FONT]
[FONT="]کد زیر یک [/FONT][FONT="]bitmap[/FONT][FONT="] به ابعاد پنجره پروژه (با استفاده از [/FONT][FONT="]fullSize[/FONT][FONT="]) میسازد[/FONT]
[FONT="] bitmap = new Bitmap(fullSize.Width,fullSize.Height);[/FONT][FONT="]کد زیر از [/FONT][FONT="]bitmap[/FONT][FONT="] یک شئ [/FONT][FONT="]Graphic[/FONT][FONT="] جهت ترسیم شکل های گرافیکی میسازد[/FONT]
[FONT="] curGraphics = Graphics.FromImage(bitmap);[/FONT][FONT="]کد زیر رنگ شئ [/FONT][FONT="]Graphic[/FONT][FONT="] ایجاد شده در مرحله قبل رو به رنگ پس زمینه فورم تغییر میده[/FONT]
[FONT="] curGraphics.Clear(this.BackColor);[/FONT][FONT="]در اینجا یک [/FONT][FONT="]Pen[/FONT][FONT="] و یک [/FONT][FONT="]Brush[/FONT][FONT="] ، برای نقاشی روی شئ [/FONT][FONT="]Graphic[/FONT][FONT="] میسازیم[/FONT]
[FONT="] curPen = new Pen([/FONT]curcolor[FONT="]);[/FONT][FONT="] curBrush = new SolidBrush([/FONT]curcolor[FONT="]);[/FONT]
[FONT="]حال به تب [/FONT][FONT="][design][/FONT][FONT="] رفته و از [/FONT][FONT="]toolbox[/FONT][FONT="] یک [/FONT][FONT="]toolstrip[/FONT][FONT="] روی فورم ایجاد می کنیم. و سه [/FONT][FONT="]button[/FONT][FONT="] مطابق شکل روی آن ایجاد میکنیم. و پنجره [/FONT][FONT="]properties[/FONT][FONT="] نام آنها را به [/FONT][FONT="]btn_Elips[/FONT][FONT="] و [/FONT][FONT="]btn_line[/FONT][FONT="] و [/FONT][FONT="]btn_rect[/FONT][FONT="] تغییر می دهیم[/FONT]
[FONT="]بر روی هر یک از [/FONT][FONT="]button[/FONT][FONT="] ها دابل کلیک میکنیم و کد رویداد [/FONT][FONT="]Click[/FONT][FONT="] را برای هر کدام به ترتیب[/FONT]
[FONT="]drawIndex = 1;[/FONT][FONT="]و[/FONT][FONT="]drawIndex = 2;[/FONT][FONT="]و[/FONT][FONT="]drawIndex = 3;[/FONT]
[FONT="]می گذاریم پس داریم[/FONT]
HTML:
private void btn_Elips_Click(object sender, EventArgs e)
{
drawIndex = 1;
}
private void btn_line_Click(object sender, EventArgs e)
{
drawIndex = 2;
}
private void btn_rect_Click(object sender, EventArgs e)
{
drawIndex = 3;
}
[FONT="]این کار رو کردیم تا موقع ترسیم، با توجه به عدد [/FONT][FONT="]drawIndex[/FONT][FONT="] ، برنامه بفهمه کدوم شکل ( خط، بیضی یا مستطیل) رو ترسیم کنه.[/FONT]
[FONT="]خوب برای ترسیم علاوه بر مشخص بودن [/FONT][FONT="]drawIndex[/FONT][FONT="] باید مختصات نقاط آغاز و پایان روهم از موقعیت و وضعیت موس بدست بیاریم پس می ریم سراغ 3 تا از رویداد های فورم که عبارتند از :[/FONT]
[FONT="]MouseDown[/FONT][FONT="] - [/FONT][FONT="]MouseMove[/FONT][FONT="] – [/FONT][FONT="]MouseUp[/FONT]
[FONT="]با انتخاب فورم در تب [/FONT][FONT="]design[/FONT][FONT="] و رفتن به [/FONT][FONT="]پنجره [/FONT][FONT="]properties[/FONT][FONT="] و انتخاب [/FONT][FONT="]events[/FONT][FONT="] بر روی هر یک از این رویداد ها دابل کلیک کرده و کد های زیر را وارد میکنیم[/FONT]
HTML:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
curX = e.X;
curY = e.Y;
dragMode = true;
}
[FONT="]تا اینجا با فشردن کلید موس مختصات آغاز را بدست آوردیم[/FONT]
HTML:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
diffX = e.X - curX;
diffY = e.Y - curY;
if (dragMode)
{
this.Refresh();
}
}
[FONT="]در اینجا با [/FONT][FONT="]drag[/FONT][FONT="] موس در هر لحظه مختصات پایانی را بدست آوردیم و از تفریق مختصات پایانی و آغازی ، طول و عرض مستطیلی را بدست می آوریم که برای رسم مستطیل و بیضی به آن احتیاج داریم. این کار را انجام می دهیم چون مل خواهیم هنگام [/FONT][FONT="]drag[/FONT][FONT="] پیش نمایشی از شکل داشته باشیم، برای درک بهتر- بعد از اتمام برنامه- یک بار این کد ها را به صورت کامنت در بیاورید وبرنامه را اجرا کنید، تفاوب را خواهید فهمید.[/FONT]
[FONT="]از [/FONT][FONT="]dragMode = true;[/FONT][FONT="] برای این استفاده کردیم تا فقط و فقط وقتی کلیک کرده ایم وهمزمان [/FONT][FONT="]drag [/FONT][FONT="] می کنیم، پیش نمایشی از شکل داشته باشیم.[/FONT]
[FONT="]تا اینجا وقتی کلیک کرده ایم وهمزمان [/FONT][FONT="]drag [/FONT][FONT="] می کنیم، شکل ایجاد شده با حرکت موس مدام تغییر می کنه(البته ترسیم در این جا با کمک رویداد [/FONT][FONT="]paint[/FONT][FONT="] صورت می گیرد که در ادامه بررسی می شود). حالا باید کاری کنیم که با بالا آمدن کلیک موس، شکل ایجاد شده ثابت بماند.[/FONT]
HTML:
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
diffX = x - curX;
diffY = y - curY;
switch (drawIndex)
{
case 1:
{
// Draw an ellipse
curGraphics.DrawEllipse(curPen, curX, curY, diffX, diffY);
break;
}
case 2:
{
// Draw a line
curGraphics.DrawLine(curPen, curX, curY, x, y);
break;
}
case 3:
{
// Draw a rectangle
curGraphics.FillRectangle(curBrush, curX, curY, diffX, diffY);
break;
}
}
// Refresh
RefreshFormBackground();
// Set drag mode to false
dragMode = false;
}
[FONT="]در رویداد [/FONT][FONT="]MouseUP[/FONT][FONT="] فورم، با استفاده از مختصات و [/FONT][FONT="]drawIndex[/FONT][FONT="]، مکان و نوع شکل ترسیمی مشخص می شود و با استفاده از قلم [/FONT][FONT="]curPen[/FONT][FONT="] و دستور ِ[/FONT][FONT="]DrawEllipse[/FONT][FONT="] شکل تو خالی ایجاد می کنیم و با [/FONT][FONT="]استفاده از قلموی [/FONT][FONT="]curBrash[/FONT][FONT="] و دستور ِ[/FONT][FONT="]FillRectangle[/FONT][FONT="] مستطیل تو پر رسم می کنیم. [/FONT]
[FONT="]متد [/FONT][FONT="]RefreshFormBackground();[/FONT][FONT="] که در زیر امده باعث می شود کشیدن شکل جدید باعث پاک شدن شکل قبلی نشود در واقع این کد تصویر جاری رو[/FONT][FONT="]background [/FONT][FONT="] فورم قرار میده.[/FONT]
HTML:
private void RefreshFormBackground()
{
curBitmap = bitmap.Clone(new Rectangle(0, 0, this.Width, this.Height), bitmap.PixelFormat);
this.BackgroundImage = curBitmap;
}
[FONT="]اینم از رویداد [/FONT][FONT="]paint[/FONT][FONT="] که دیگه فکر نکنم توضیح بخواد.[/FONT]
HTML:
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
// If dragMode is true, draw the selected
// graphics shape
if (dragMode)
{
switch (drawIndex)
{
case 1:
{
g.DrawEllipse(curPen, curX, curY, diffX, diffY);
break;
}
case 2:
{
g.DrawLine(curPen, curX, curY, x, y);
break;
}
case 3:
{
g.FillRectangle(curBrush, curX, curY, diffX, diffY);
break;
}
}
}
}