کلاس نقاشی ( Class TCanvas ) :

در این کلاس متدها و روالهای متعددی وجود دارد ( Function And Procedure ) شما با استفاده از این روالها و دستورات به راحتی می توانید به طراحی و ترسیم بپردازید . این کلاس که معمولا در بخش گرافیک کامپیوتری و ترسیمات مورد استفاده قرار می گیرد امکانات متعددی را برای ایجاد ترسیمات دلخواه و حتی ایجاد کامپوننتهایی با اشکال مختلف در اختیار شما قرار می دهد . و ما در این بخش شما را با اجزای مختلف این کلاس آشنا می سازیم . که به علت فراوانی دستورات و پروسه ها این آموزش را در 3 درس ارائه می دهیم .

درس اول ***


چگونگی استفاده از TCanvas :

این کلاس که از کلاسهای درونی دلفی محسوب می شود معوملا در بعضی از کلاسهای گرافیکی مورد استفاده قرار می گیرد ولی در کل شما در مواردی مانند ترسیمات کامپوننتها و حتی در مواردی همچون آبجیکت های TLabel , TForm , TListBox , .... نیز برای انجام ترسیمات در اختیار شما قرار گرفته است .
در اینجا نوبت به چگونگی دست رسی به این کلاس می رسد :
استفاده درون اشیاء آماده :
اگر از اشیا خود دلفی و یا از کلاسهای دارای این کلاس درونی استفاده می کنید ، می توان گفت که برای دست رسی در اکتر مواقع مشخصه یا Property به نام Canvas در اختیار شما قرار دارد که شما با استفاده از این مشخصه می توانید همانند مشخصه های دیگربه زیر روال ها و متدهای این کلاس دست رسی پیدا کنید . مانند روشهای زیر :
کد:
کد:
 Label1.Canvas.Refresh();
Image1.Canvas.Refresh();
ListBox1.Canvas.Refresh();
همانطور که در بالا مشاهده می کنید با استفاده از نام یک شی ( Object ) به راحتی می توان به کلاس زیرین نقاشی آن دست پیدا کرد . البته به شرط وجود و توانایی دست رسی به آن .
پس از دست رسی به مشخصه نقاشی ما احتیاج به دست رسی به صفت ها ، مشخصه ها و دستورات درونی مشخصه می باشیم . برای این کار کافیست تا با زدن نقطه پس از نام مشخصه Canvas به لست متدها و روالهای آن دست رسی پیدا کنید . همانند مثال بالا که علامت نقطه با رنگ قرمز مشخص شده است .

ایجاد و ساخت کلاسهای دلخواه :
برای ایجاد کلاسهای دلخواه برای دست رسی به اشیاء و محیطهای دلخواه به صورت زیر عمل می کنیم .
1- ابتدا یک متغییر از نوع کلاس TCanvas تعریف می کنیم . که این متغییر بسته به نیاز ما می تواند سراسری و یا درونی باشد . در اینجا به یک مثال توجه کنید که تا انتها در مراحل بعد نیز با همین مثال پیش می رویم :
کد:
کد:
 Var 
   ADesktop:TCanvas;
2- پس از تعریف متغییر در اینجا نوبت به ساخت و تخصیص حافظه به متغییر می رسد . توجه کنید که اگر بدون ساخت یک متغییر قصد استفاده از آن را داشته باشید با خطای هین برنامه با پیام عدم درسترسی به محافظه بر خورد می کنید . برای این کار مجدد از کلاس TCanvas استفاد می کنیم . همانند مثال
کد:
کد:
 Var 
   ADesktop:TCanvas;
begin
  ADesktop := TCanvas.Create;
...
End;
3- در این قسمت می بایست دسته یا دستگیره Handel متغییر را به یک کنترل نصبت بدهیم تا بتوانیم از آن کنترل استفاده کنیم . این کار معمولا با استفاده از Function به نام GetDC صورت می پذیرد . به طور مثال م قصد دست یابی به کنترل دسکتاپ Desktop را داریم تا بر روی آن طراحی انجام دهیم . با توجه به مثال بالا این چنین عمل می کنیم.
نکته : Handel یا HWND ها شماره های خاصه هر کنترل یا پنجره می باشند که سیستم عامل با توجه به آنان به اشیاء دست رسی پیدا می کند . به طور مثال دست گیره صفحه دسکتاپ ( 0 ) صفر و یا برای دستیابی به دستگیره Form1 از Form1.Handel استفاده می کنیم . برای راهنمایی بیشتر می توانید از راهنمای خود محیط دلفی استفاده کنید . کافیست تا کلمه را تایپ کرده و کلیدهای CTRL+F1 را فشار دهید .
کد:
کد:
 ...
ADesktop.Handel :=  GetDC(0);
....
حال کلاس شما آماده برای استفاده می باشد . شما می توانید با استفاده از زیر روالها و متدهای درونی متغییر تعریف شده به طراحی بپردازید .

توجه به این نکته ضروریست که پس از اتمام کار با متغییر حتما فضای اختصاص یافته به متغییر را رها کنید همانند زیر .
کد:
کد:
 ....
ADesktop.free;
End
برای دریافت اینکه چگونه می توانید عملیات ترسیمی را انجام دهید می بایست تا ارسال بعد منتظر بمانید یا اینکه با استفاده از راهنمای مشخصه های خود دلفی با استفاده از کنجاوی خودتان به انجام این کار بپردازید .

تا ارسال بعد منتظر بمانید .
بالا |+| نوشته شده توسط محمود آزادی در جمعه شانزدهم تیر 1385 | موضوع: آموزش دلفی و برنامه نویسی

==============================================


منبع:
Persianblog.com - persian business Resources and Information.This website is for sale!
======================

هندل؟!

بورلند دلفي - كه آخرين نگارش موجود آن در بازار دلفي 7 است - علاوه بر دستوراتي كه براي كنترل محيط برنامه دارد، براي كنترل اكثر اشياي ويندوز (Windows) نيز امكانات زيادي را در اختيار برنامه نويس قرار مي دهد. از اين ميان امكان دستكاري (Handling) اجزاي برنامه هاي مختلف را مورد مطالعه قرار مي دهيم.

بطوريكه مي دانيد، هريك از اجزايي كه در پنجره هاي مختلف ويندوز مشاهده ميشود و يا حتي آنهايي كه قابل مشاهد نيست، با اعداد صحيح بزرگتر از صفر (Cardinal) و متمايز از هم شماره گذاري مي شوند. به اين اعداد اصطلاحاً هندل (Handle) گفته مي شود. اشيايي مانند Textbox,lable,button,... هركدام هندلي منحصربفرد دارند. اجزا (components) بكار رفته پروژة دلفي شما نيز اگر از فرزندان TWinControl باشد، داراي هندل هستند. در برنامه هاي مختلف مي توان با استفاده ازش هندل يك شئ (object) به داده هاي مربوط به شئ دسترسي يافته و حتي در اغلب موارد مي توان مشخصات مربوط به اشياء را تغيير داد. در مثالي كه خواهد آمد، با استفاده از هندل Desktop ، يك تايمر، گرافيك يا متن دلخواه خود را بر روي آن خواهيم نوشت.

اولين سؤالي كه پيش مي آيد اين است كه هندل محتويات Desktop را چگونه بايد يافت؟! جواب اين سؤال تابع Get Device Context زير است:
کد:
کد:
 Handle:=GetDC(Hwnd_Desktop);
سپس با اختصاص اين هندل به يك Canvas مي توانيم مانند ساير ترسيمهايي كه در دلفي مي توان انجام داد، بر روي Desktop نيز بنويسيم.
کد:
کد:
CustomCanvas.Handle:=Handle;
پس از اينكه با نحوة يافتن هندل آشنا شديم، به بررسي خواص (properties) و روالهايي (Methods) مي پردازيم كه در كلاس TCanvas براي اينكار مهيا است.

Canvas وسيله ايست كه توسط آن مي توان در ظاهر اجزاي ويژوال تغييراتي ايجاد نمود. در زير برخي خواص و روالهاي مربوط به Canvas آورده شده است:


Properties:
کد:
کد:
 Brush مشخصات مربوط به مساحتها

Pen مشخصات قلم ترسيم

Handle هندل

Pixels رنگ يك پيكسل خاص از تصوير

Font خصوصيات قلم متن

Methods:
کد:
کد:
 Arc ترسيم كمان

CopyRect كپي قسمتي از تصويربه تصويري ديگر

Creat ايجاد 

Draw رسم يك گرافيك

Ellipse رسم بيضي و دايره

FillRect رنگ كردن يك مستطيل

FloodFill رنگ كردن داخل يك شكل بسته

LineTo رسم خط از نقطة جاري

MoveTo تغيير نقطة جاري

Pie رسم قسمتي از بيضي

Polygon رسم چندضلعي

Rectangle رسم مستطيل

RoundRect رسم مستطيل با گوشه هاي دايروي

TextOut نوشتن متن
حال كه بخشهاي مهم برنامه را شناختيم، به سراغ خود برنامه مي رويم.


برنامه اي براي نوشتن متن روي Desktop

يك برنامه جديد را در دلفي ايجاد كنيد. با دوبل كليك كردن فرم، رويداد (event) مربوط به زمان بار شدن فرم را ظاهر كنيد:
کد:
کد:
 Procedure TForm1.FormCreate(Sender:TObject);

Begin

End;
كدها را به طرف بالا اسكرول كرده و در قسمت Var و قبل از implementation متغير را معرفي كنيد:
کد:
کد:
 var

Form1: TForm1;

DesktopCanvas:TCanvas;

implementation
سطرهاي زير را براي ايجاد Canvas و اختصاص هندل بين سطرهاي شروع و پايان پروسيجر FormCreate وارد كنيد:
کد:
کد:
 DesktopCanvas:=TCanvas.Create;
اين سطر متغير را از نوع TCanvas ايجاد مي كند.
کد:
کد:
 DesktopCanvas.Handle:=GetDC(Hwnd_Desktop);
در اين سطر نيز هندل مختص Desktop را به ترسيم خود نسبت مي دهيم.

حال يك Button به فرم خود اضافه كنيد. آنرا دوبل كليك كرده و كدهاي زير را وارد كنيد:
کد:
کد:
 DesktopCanvas.Brush.Style:=bsClear;
زمينة (Background) سطح متني كه در سطر بعد مي نويسيم را رنگي نمي كند. اين سطر را اگر حذف كنيد، زمينة متن پاك خواهد شد.
کد:
کد:
DesktopCanvas.TextOut(10,10,'This is your text on the Desktop!');
اين سطر موجب مي شود تا به هنگام فشار دادن كليد در برنامه، عبارت This is your text on the Desktop! در گوشة بالا سمت چپ بر روي Desktop شما نوشته شود، البته با قلم و رنگ پيش فرض.

تمام شد! برنامه را مي توانيد Compile و يا اجرا (Run) كنيد. مي توانيد كارهاي ديگري را نيز انجام دهيد، كارهايي مانند آنچه در نرم افزارهاي Desktop Toys يا نرم افزار نگار انجام شده است.

مثلا براي نمايش ساعت جاري مي توانيد يك Timer از صفحة System به برنامة خود اضافه كنيد. تايمر را دوبل كليك كرده و كدهاي زير را براي رويداد ontimer آن اضافه كنيد:
کد:
کد:
 DesktopCanvas.TextOut(10,40,TimeToStr(Time));
برنامه را بار ديگر اجرا كنيد. حالا شما يك ساعت در گوشه سمت چپ داريد. مي توانيد بيشتر وقت شناس باشيد!

اگر نگران خط خطي شدن Desktop خود شده ايد، اگر برنامه اي در آن گوشه اجرا شود همة متنها پاك خواهد شد.

در پايان يكبار ديگر تمام متن فايل ذكر مي شود تا اگر در درج كدها اشتباهي شده باشد، براحتي اصلاح شود. در پايان لازم به ذكر است كه اين دستورات تقريبا در تمامي نگارشهاي دلفي موجود است و در نگارشهاي 3 و 6 و7 (client/server-proffesional-personal) توسط نگارنده آزمايش شده است.
کد:
کد:
 unit dsktop_handling;


interface


uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;


type

TForm1 = class(TForm)

Button1: TButton;

Timer1: TTimer;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;


var

Form1: TForm1;

DesktopCanvas:Tcanvas;


implementation


{$R *.DFM}


procedure TForm1.FormCreate(Sender: TObject);

begin

DesktopCanvas:=TCanvas.Create;

DesktopCanvas.Handle:=GetDC(HWND_DESKTOP);

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

DesktopCanvas.Brush.Style:=bsClear;

DesktopCanvas.TextOut(10,10,'This is a text');

end;


procedure TForm1.Timer1Timer(Sender: TObject);

begin

DesktopCanvas.TextOut(10,40,TimeToStr(Time));

end;


end.