نوافذ متعددة الأشكال (الجرء الأول)

بسم الله الرحمن الرحيم
سنرى من خلال هذه المقالة كم هو سهل بناء نوافذ و عناصر تحكم بأشكال متعددة من خلال مثال يوضح إمكانية استخدام هذه التقنية في البرمجة.

المثال:


سنحاول بناء برنامج بشكل ساعة ذات عقارب ولبناء البرنامج سنقوم بالآتي

1. بناء نموذج دائري الشكل بدون شريط عنوان.

2. عند فقدان شريط العنوان لن يستطيع المستخدم تحريك النافذة على سطح المكتب ولذلك سنقوم بكتابة إجراء مناسب لتمكين المستخدم من تحريك النافذة من أي مكان بداخله.

3. يجب أن يقوم البرنامج برسم العقارب كل ثانية و هذا عن طريق المؤقت و لتحديد شكل العقارب سنحتاج للعديد من الحسابات.

procedure TForm1.FormCreate(Sender: TObject);
var HRGN : Thandle;
begin
//بدون شريط عنوان
BorderStyle := bsNone;

//مربع الشكل
Width := 200;
Height := 200;

//السطر الأول لرسم منطقة مستديرة
//والثاني إسنادها إلى النموذج
HRGN := CreateEllipticRgn(0,0,width,height);
SetWindowRgn(Handle,HRGN,true);
end;



هذا الاجراء يحقق الهدف الأول
و أبرز ما فيه السطرين الأخيرين لبناء النموذج الدائري و لعل من المفيد سرد الاجراءات المستخدمة لبناء المناطق والتعامل معها في نظام التشغيل ويندوز

CombineRgn
CreateEllipticRgn
CreateEllipticRgnIndirect
CreatePolygonRgn
CreatePolyPolygonRgn
CreateRectRgn
CreateRectRgnIndirect
CreateRoundRectRgn
EqualRgn

أما الهدف الثاني فهو سهل جدا و هذا هو الكود:


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform(wm_Syscommand, $f012, 0)
end;


والآن سنستعين بالرياضيات لمساعدتنا على رسم مستطيلات بدل أرقام الساعة و لرسم العقارب أيضا و لذلك نورد بعض الملاحظات

1. بما أن نظام احداثيات الحاسب يبدأ في الزاوية اليسرى العليا من النافذة سيكون لزاما علينا تحديد مركز احداثيات آخر في منتصف النافذة (X0,Y0) وهذا لاجراء الحسابات الرياضية اللازمة
2. بعد الانتهاء من الحساب سنستخدم دوال الانسحاب للتحويل بين نظامي الاحداثيات
3. سنعرف متغير يحتوي على قيمة أقل من نصف قطر الدائرة Len
4. سيكون طول عقرب الساعات 9/10 من Len والدقائق 3/4 و الثواني 1/2
5. يتم تحديث العقارب عند تشغيل المؤقت كل ثانية وذلك بمحو القديمة ورسم الجديدة ولذلك سنكتب اجراء خاص برسم العقارب بالاعتماد على متغير منتمي يحتوي الوقت المطلوب رسمه ...

سنعرف المتغيرات السابقة كالتالي:

type
TForm1 = class(TForm)
……...
……..
private
{ Private declarations }
Currenttime : Tdatetime; // Like counter
X0, Y0 : integer; // form center
Len : integer; // circle radious
procedure DrawWatchHand; // Update watchhands
public
{ Public declarations }
end;

أما الاجراء الخاص برسم العقارب فهو:

procedure TfmainClock.DrawWatchHand;
Var
X1, Y1 : integer;
H, M, S, MS : Word;
Angle : Double;
begin
DecodeTime(Currenttime, H, M, S, MS);

// Now draw Second
Canvas.MoveTo(X0, Y0);
Angle := S * 2 * Pi / 60;
X1 := trunc(X0 + 9*Len * Sin(Angle)/10);
Y1 := trunc(Y0 - 9*Len * Cos(Angle)/10);
Canvas.LineTo(X1, Y1);

// Now draw Minute
Canvas.MoveTo(X0, Y0);
Angle := M * 2 * Pi / 60;
X1 := trunc(X0 + 3*Len * Sin(Angle)/4);
Y1 := trunc(Y0 - 3*Len * Cos(Angle)/4);
Canvas.LineTo(X1, Y1);

// Now draw Hour
Canvas.MoveTo(X0, Y0);
Angle := H * 2 * Pi / 12;
X1 := trunc(X0 + Len * Sin(Angle)/2);
Y1 := trunc(Y0 - Len * Cos(Angle)/2);
Canvas.LineTo(X1, Y1);
end;



والآن علينا اضافة المؤقت وجعل خاصية Iterval=1000 أي ثانية واحدة و كتابة الاجراء التالي


procedure TfmainClock.Timer1Timer(Sender: TObject);
begin
Canvas.Pen.Color := clBtnFace;
DrawWatchHand; // clear
currenttime := time;
Canvas.Pen.Color := clBlack;
DrawWatchHand; // set
end;


أوشك البرنامج على الانتهاء ولم يبق إلا رسم المستطيلات النائبة عن أرقام الساعة و اليك الكود المطلوب:

procedure TForm1.FormPaint(Sender: TObject);
Var
X1, Y1, i : integer;
Angle : double;
begin
Canvas.Pen.Mode := pmXor;
Canvas.Pen.Color := clBtnFace;
for i:=1 to 12 do
begin
Angle := i * 2 * Pi / 12;
X1 := trunc(X0 + Len * Sin(Angle));
Y1 := trunc(Y0 - Len * Cos(Angle));
Canvas.Rectangle(X1-4,Y1-4,X1+4,Y1+4)
end;
Canvas.Pen.Mode := pmCopy;
Canvas.Pen.Color := clBlack;
DrawWatchHand;
end;


لتحميل المثال نرجو زيارة الصفحة التالية

http://www.angelfire.com/extreme4/delphi
المنتديات

التعليقات

إضافة تعليق جديد

لا يسمح باستخدام الأحرف الانكليزية في اسم المستخدم. استخدم اسم مستخدم بالعربية

Restricted HTML

  • وسوم إتش.تي.إم.إل المسموح بها: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • تفصل السطور و الفقرات تلقائيا.
  • Web page addresses and email addresses turn into links automatically.

دعوة للمشاركة

موقع الأيهم صالح يرحب بالمشاركات والتعليقات ويدعو القراء الراغبين بالمشاركة إلى فتح حساب في الموقع أو تسجيل الدخول إلى حسابهم. المزيد من المعلومات متاح في صفحة المجتمع.