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

هندل؟!

بورلند دلفی - که آخرین نگارش موجود آن در بازار دلفی 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 : نوشتن متن

--------------------------------------------------------------------------------------------------------

کلاس نقاشی ( 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

 

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد