# Native Code > برنامه نویسی در Delphi > مباحث عمومی دلفی و پاسکال >  مقاله : توابع گرافیکی و استفاده از آنها ...

## Mahmood_M

با سلام خدمت دوستان ...
قصد دارم در طی یک مقاله مطالبی در مورد توابع گرافیکی و کاربردهای آنها در دلفی بنویسم ...
مطمئنا یکی از لذت بخش ترین و جذابترین قسمتهای برنامه نویسی ( برای بیشتر برنامه نویسان ) ، کار با توابع گرافیکی و ساخت ویرایشگرهای گرافیکی است ...
...
کار بر روی یک TImage :
نکات ابتدایی و مهم :
برای کار بر روی یک TImage ( کارهایی مثل رسم با موس و نوشتن و ... ) باید 2 تا از خصوصیات و امکانات TImage را بشناسید :  1. Brush   و   2. Pen 
عنصر Brush ( براش ) 2 امکان کارآمد دارند ، یکی Style و دیگری Color 
Style درواقع نوع نمایش زمینه یک TImage است ، Color هم رنگ زمینه آن

عنصر Pen ( پن ) درواقع قلم شماست و با تنظیم خصوصیات آن میتوانید اندازه ، فونت و ... دلخواه خود را برای رسم و نوشتن به کار گیرید ...

تغییر رنگ زمینه یک TImage :
برای این کار باید مقدار Color عنصر Brush را برابر با رنگ مورد نظر قرار دهید :
Image.Canvas.Brush.Color := ClWhite;
با این کد رنگ زمینه Image به سفید تغییر می یابد ... ( فعلا بر روی یک TImage خالی و بدون عکس کار میکنیم )

تغییر رنگ یک Pixel یا ایجاد یک نقطه کوچک ! بر روی Image :
بدین منظور باید از دستور زیر استفاده نماییم :
Image.Canvas.Pixels[X, Y] := clRed;
توجه کنید که دستور [Canvas.Pixels[X, Y ، یک خروجی TColor است ، و میتوانید یک متغیر را برابر با آن قرار داده و رنگ پیکسل مورد نظر را دریافت نمایید ...
مقادیر X و Y ، مختصات پیکسلی هستند که میخواهیم رنگ آن را بدست آورده یا تغییر دهیم ، اگر قصد دارید که با کلیک موس بر روی Image ، رنگ پیکسلی که کلیک بر روی آن انجام گرفته ، تغییر کند باید دو متغیر برای X و Y در قسمت بالای فرم یا در Public یا ... تعریف کنید ( جایی که امکان استفاده از آنها در سایر Event ها هم باشد ) ، سپس در رویداد OnMouseMove مربوط به TImage ، این دو متغیر را با مقدارهای X و Y مربوط به مختصات موس مقداردهی کنید ، سپس در رویداد OnClick موس بر روی TImage و در کد مربوط به تغییر رنگ پیکسل ، میتوانید از متغیرهایی که تعریف کرده اید به عنوان X و Y ( مختصات نقطه کلیک شده ) استفاده کنید :
var
  Form1: TForm1;
  MX, MY : Integer;

implementation

{$R *.dfm}

procedure TForm1.ImageClick(Sender: TObject);
begin
 Image.Canvas.Pixels[MX, MY] := clRed;
end;

procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 MX := X;
 MY := Y;
end;
به جای کارهای بالا میتوانید از OnMouseDown استفاده نمایید ... !

آغاز رسم ...
رسم یک خط :
برای رسم یک خط ، باید از دستور LineTo استفاده کنیم ...
Image.Canvas.LineTo(X, Y);
بهتر است در هنگام استفاده از این توابع مدیریت صحیح و بهتری داشته باشیم ، به عنوان مثال برای این که با حرکت موس ، خطی بر روی یک TImage رسم کنیم ، باز هم به چند متغیر و چند رویداد نیازمندیم ...
توجه کنید که اگر تنها در رویداد OnMouseMove مربوط به Image از دستور LineTo استفاده کنید و مقادیر X و Y موس را به آن بدهید ، رسم خط از نقطه ( Pixel ) بالا و سمت چپ تصویر شروع شده و با حرکت موس ادامه می یابد ...
برای جلوگیری از این موضوع باید به صورت زیر عمل کنیم :
ابتدا یک متغیر در قسمت Public یا ... فرم تعریف میکنیم ، تا به وسیله آن مشخص کنیم که موس در حالت کلیک شده ( Down ) است یا نه و اگر جواب مثبت بود ، با حرکت موس ، رسم خط را شروع می نماییم ...
برای این کار ابتدا یک متغیر مثلا با نام MDown و از نوع Boolean تعریف نمایید ، سپس در رویداد OnMouseDown مربوط به Image ، آن را True نموده و در رویداد OnMouseUp مربوط به Image آن را False نمایید ...
در آخر برای رسم خط در رویداد OnMouseMove مربوط به Image چک کنید که اگر متغیر مربوط به Down بودن موس True بود ، رسم انجام شود و اگر نبود انجام نشود :
var
  Form1: TForm1;
  MDown : Boolean;

implementation

{$R *.dfm}

procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MDown = True then
  begin
   Image.Canvas.LineTo(X, Y);
  end;
 Image.Canvas.MoveTo(X, Y);
end;

procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MDown := True;
end;

procedure TForm1.ImageMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MDown := False;
end;
توجه کنید که ما در OnMouseDown در آخر کد از Canvas.Move استفاده کردیم ، این کد اشاره گر Canvas را به مختصات مورد نظر ما منتقل میکند تا رسم خط از همانجا شروع شود و ادامه یابد ، اگر از این دستور استفاده نکنیم ، همانطور که در بالا ذکر شد ، خط ما از بالا و سمت چپ عکس شروع خواهد شد ... ( دلیل این که چرا در آخر کد از این دستور استفاده کردیم را با کمی بررسی خواهد فهمید )

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

رسم یک چند ضلعی :
برای رسم یک چند ضلعی ، میتوان از دستورات Polyline و Polygon استفاده کرد، در این دستورات هر تعداد که بخواهید می توانید مختصاتی برای نقاط مشخص کنید ، پارامتر وردی این توابع یک آرایه از نوع Point است ، به کد زیر نگاه کنید :
procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Image.Canvas.Polyline([Point(40, 10), Point(20, 60), Point(70, 30), Point(10, 30), Point(60, 60), Point(40, 10)]);
end;
در کد بالا ما حدود 6 نقطه وارد نمودیم ، توجه کنید که نقاط را با استفاده از تابع Point مشخص نمایید ... ، کد بالا یک ستاره بر روی Image رسم خواهد کرد ...
در این توابع ، نقطه دوم به نقطه اول و نقطه سوم به نقطه دوم و همین طور الی آخر ، نقاط به یکدیگر وصل شده و یک چند ضلعی را رسم می کنند ( در تعیین مختصات باید دقت زیادی داشت )

رسم یک بیضی یا دایره :
برای رسم یک بیضی یا دایره از دستور Elipse استفاده می شود ، به کد زیر دقت کنید :
 Image.Canvas.Ellipse(100, 120, 190, 200);
این کد یک دایره رسم خواهد کرد ...
نکته مهم :
این تابع 4 پارامتر دارد ، ( X1 ، Y1 ، X2 ، Y2 ) ، توجه کنید که اگر هرکدام از مقادیر X1 , X2   و  Y1 , Y2 با هم مساوی باشند ، دایره یا بیضی رسم *نخواهد شد* ...

همانطور که مشاهده می کنید ، اکثر توابع گرافیکی از قاعده ای مشابه استفاده میکنند ، برای اینکه گفتن و توضیح همه توابع از محدوده این مقاله خارج است ، فقط به وظیفه آنها اشاره میکنیم و برای امتحان هرکدام از آنها میتوانید شخصا اقدام کنید !

سایر توابع :
Pie : برای رسم یک برش از دایره به کار می رود ( مثلا نیم دایره )Chord : برای رسم کمان بسته ( شبیه نیم دایره یا ... )Arc : برای رسم کمان بازRectangle : برای رسم مستطیلRoundRect : برای رسم مستطیل لبه گرد...

نوشتن متن بر روی TImage :
برای نوشتن متن بر روی یک Image میتوانیم از دستور TextOut استفاده نماییم ، این دستور یک 3 پارامتر دارد ، پارامت اول و دوم مربوط به مختصات متن و پارامتر بعدی مربوط به متن مورد نظر است ...
مثال :
 Image.Canvas.TextOut(10, 20, 'My Name is Mahmood');

کپی قسمتی از فایل تصویری و نمایش بر روی یک TImage :
برای این کار از دستور BrushCopy استفاده میکنیم ، این تابع قسمت مورد نظر از یک فایل تصویری را کپی کرده و در TImage رسم میکند :
مثال :
var
 MyBmp : TBitmap;
 Rec : TRect;
begin
 MyBmp := TBitmap.Create;
 Rec := Rect(0, 0, 100, 100);
 MyBmp.LoadFromFile('M.bmp');
 Image.Canvas.BrushCopy(Rec, MyBmp, Rec, clWhite);
 MyBmp.Free;
end;

کپی یک قسمت از Image :
بدین منظور از دستور CopyRect استفاده می شود ، این تابع ، قسمتی از یک Image رو کپی کرده و در مختصات دیگری رسم می نماید ...
این تابع سه پارامتر دارد : 1. مکانی که باید کپی شود ( TRect )   و  2. Canvas ای که باید کپی شود ( باید یک Bitmap باشد )    و   3. مکانی که باید قسمت کپی در آن قرار گیرد ( TRect )

دستور FillRect :
این دستور یک تصویر Bitmap را درون یک مستطیل ( Rect ) از Image کپی میکند :
ابتدا باید یک متغیر از نوع TBitmap تعریف کرده و سپس آن را Create کرده و لود کنیم ، سپس با مقدار Image.Canvas.Brush.Bitmap را برابر آن قرار میدهیم و در آخر با دستور FillRect ، تصویر لود شده را درون قسمتی که در پارامتر تابع FillRect مشخص میشود رسم میکنیم ...

رسم یک Bitmap در یک TImage :
برای این کار از دستور Draw استفاده می کنیم ، این دستور یک Bitmap را در مختصاتی مشخص قرار می دهد ، این تابع 3 پارامتر دارد که دو پارامتر اول مربوط به مختصات و پارامتر آخر مربوط به Bitmap مورد نظر است ...

*نکات مفید و مهم :*

تغییر رنگ ، فونت و اندازه قلم :
برای تغییر رنگ قلم در هنگام رسم و نوشتن ، باید مقدا Color مربوط به عنصر Pen را تغییر دهید :
Image.Canvas.Pen.Color := ClRed;

برای تغییر فونت نوشته روی Image باید مقدار Font مربوط به عنصر Canvas را تغییر دهید :
Image.Canvas.Font := Tahoma;

برای تغییر اندازه قلم باید خاصیت Width عنصر Pen را تغییر دهید :
Image.Canvas.Pen.Width := 20;

با اسفتفاده از دستور Image.Canvas.Penpos ، میتوانید مختصات فعلی قلم Canvas را بدست آورید ...

توصیه میکنم گزینه های قسمت Mode مربوط به Pen را حتما امتحان نمایید :
Image.Canvas.Pen.Mode := pmCopy or ...;

پایان ...

این مقاله ، درواقع نقطه شروعی بود برای کسانی که میخوان کارهای گرافیکی بکنند ...
امیدوارم مفید بوده باشه ...

موفق و پیروز باشید ...

----------


## 1485159

نمیخواین ادامه بدین؟
منظورم مسائل پیشرفته تر هست

----------

