تجميل القائمة الخاصة بك مع دلفي
تحتوي العديد من البرامج ضمن نظام Windows على قوائم جميلة جدًا، مثل شعار Windows الطويل من أعلى إلى أسفل على الجانب الأيسر من قائمة "ابدأ" في Windows، أو يوجد رمز صغير على الجانب الأيسر من كل شريط قوائم مثل Word هذه القوائم الرائعة، هل تشعر أن القائمة الخاصة بك تبدو مملة؟ ليست هناك حاجة لعناصر تحكم من طرف ثالث، ويمكن تحقيق الوظائف المذكورة أعلاه باستخدام دلفي.
إذا كنت تريد تنفيذ قائمة مخصصة، فأنت بحاجة إلى تغيير حجم القائمة عند رسم القائمة لتتكيف مع الرسومات المرسومة في القائمة، ثم رسم تأثير القائمة الذي تحتاجه عليها. في دلفي، كل عنصر قائمة يتوافق مع عنصر تحكم TmenuItem. هذا النوع من التحكم له حدثين: OnDrawItem وOnMeasureItem لتنفيذ قائمة مخصصة، يجب عليك أولاً تقديم هذين الحدثين.
يتم تعريف الحدث OnMeasureItem كما يلي:
اكتب TMenuMeasureItemEvent = PROcedure (المرسل: TObject؛ ACanvas: TCanvas؛
فار العرض، الارتفاع: عدد صحيح) للكائن؛
الخاصية OnMeasureItem: TMenuMeasureItemEvent;
يتم إنشاء هذا الحدث عندما يراقب شريط القائمة حجمه الخاص. تحدد المعلمة Acanvas الكائن الرسومي المراد رسمه، وتحدد المعلمات Width وHeight الحجم الافتراضي لعنصر القائمة. هل لاحظت وجود var قبل هذين التعريفين؟ يعني أنه يمكنك استخدام حدث OnMeasureItem، وتغيير هاتين القيمتين في وظيفة المعالجة يعني تغيير حجم القائمة.
يتم تعريف الحدث OnDrawItem كما يلي:
اكتب TMenuDrawItemEvent = الإجراء (المرسل: TObject؛ ACanvas: TCanvas؛
ARect: TRect؛ محدد: منطقي) للكائن؛
الخاصية OnDrawItem: TMenuDrawItemEvent;
يتم تشغيل هذا الحدث عند رسم القائمة. تحدد المعلمة Acanvas كائن رسم القائمة، وتحدد المعلمة Arect منطقة الرسم في القائمة، وتحدد المعلمة Selected ما إذا كان عنصر القائمة الحالي محددًا أم لا.
كما ترون من المقدمة أعلاه، لتنفيذ قائمة مخصصة، ما عليك سوى كتابة التعليمات البرمجية في حدث OnMeasureItem لتغيير حجم عناصر القائمة، ثم رسم التأثير الذي تحتاجه في حدث OnDrawItem.
سأقدم أدناه مثالاً محددًا للتوضيح. هذا المثال هو جعل القائمة الخاصة بك تعرض وظيفة شريط الشعار مثل قائمة ابدأ في Windows. وفي الوقت نفسه، يمكن لهذا البرنامج أيضًا ملء شريط القائمة المحدد بلون متدرج (تمامًا مثل قائمة شريط المهام في 3721 برنامج موقع صيني). فكرة البرنامج هي كما يلي: قم أولاً بإنشاء صورة نقطية طويلة، ثم قم بتغيير عرض وارتفاع عناصر القائمة في حدث OnMeasureItem لكل شريط قائمة وفقًا للنص والصور التي سيتم عرضها في القائمة والاحتياجات البرنامج ثم قم بنسخ الجزء المقابل من الصورة النقطية إلى عنصر القائمة في الحدث OnDrawItem. إذا تم تحديد شريط القائمة، فقم أولاً بتغيير لون الفرشاة لمعلمة Acanvas، ثم املأ الأجزاء المقابلة من شريط القائمة بدورها، وبالتالي تحقيق تعبئة متدرجة اللون لشريط القائمة المحدد. وأخيرا، يتم إخراج النص إلى شريط القائمة.
دعنا نقدم الإجراء المحدد أولاً، استخدم برنامج الصور لإنشاء ملف صورة نقطية طويل (يمكنك ضبط نسبة العرض إلى الارتفاع للصورة وفقًا لاحتياجاتك، وهي في صورتي 10:1). قم بإنشاء مشروع جديد في دلفي، وأضف عنصر تحكم TImage إلى Form1، وقم بتعيين خاصية AutoSize لعنصر التحكم إلى True. ثم قم بإضافة عنصر تحكم TMainMenu إلى Form1، وقم بتعيين خاصية OwnerDraw الخاصة به على True (هذا مهم جدًا، وإلا فلن يمكن تنفيذ البرنامج) وأضف 6 كائنات TMenuItem ضمن TMainMenu (انقر بزر الماوس الأيمن فوق عنصر التحكم TMainMenu، ثم انقر فوق القائمة المنبثقة- عنصر مصمم القائمة لأعلى، يمكنك إضافة شريط قائمة في نافذة التصميم)، قم بتعيين خصائص الاسم الخاصة بهم على Caption1، Caption2، ...، Caption6 على التوالي.
فيما يلي قائمة برامج محددة:
قائمة مالك الوحدة؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار،
القوائم، ExtCtrls، StdCtrls، ImgList؛
يكتب
TForm1 = الفئة (TForm)
القائمة الرئيسية 1: القائمة الرئيسية؛
Main1: TMenuItem;
Caption1: TMenuItem;
Caption2: TMenuItem;
Caption3: TMenuItem;
Caption4: TMenuItem;
Caption5: TMenuItem;
Caption6: TMenuItem;
Image1: تيماج؛
الإجراء Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
إجراء Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
إجراء Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
إجراء Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
إجراء Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
الإجراء Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
الإجراء Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
إجراء Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
إجراء Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
الإجراء Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
الإجراء Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
الإجراء Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
خاص
{تصريحات خاصة}
عام
الإجراء DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
المحدد: Boolean;strOUT:String);
{التصريحات العامة}
نهاية؛
فار
Form1: TForm1؛
i,iH,Ind,iW,iRate:Integer;
rTemp:TRect;
iG1، iG2: عدد صحيح؛
تطبيق
{$R *.DFM}
الإجراء TForm1.DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
المحدد: Boolean;strOut:String);
فار
ي: عدد صحيح؛
يبدأ
i:=ARect.Bottom -ARect.Top; // احصل على ارتفاع وعرض النسيج
إند:=Sender.MenuIndex;
iH:=Round(Image1.Height/6*Ind); // احصل على موضع النسيج
// انسخ الصورة النقطية في الموضع المقابل من الصورة إلى القائمة
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Image1.Width، Round(Image1.Height/6)، SRCCOPY)؛
إذا تم تحديده، فابدأ // تم تحديد عنصر القائمة
ACanvas.Font.Color := clWhite;
rTemp:=ARect;
rTemp.Left := rTemp.left+iW;
iG1:=Round((rTemp.Right - rTemp.Left)/10);
rTemp.Right := rTemp.Left +iG1;
لـ j:= 0 إلى 9، ابدأ // اضبط تأثير التدرج اللوني من خلال الحلقة
ACanvas.Brush.Color := RGB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.Left := rTemp.Left +iG1;
rTemp.Right := rTemp.Left +iG1;
نهاية؛
نهاية
آخر يبدأ // لم يتم تحديد عنصر القائمة هذا
ACanvas.Brush.Color := cl3DLight; // اضبط لون الخلفية على اللون الرمادي الفاتح
rTemp:=ARect;
rTemp.Left := rTemp.left+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
نهاية؛
// اضبط وضع تعبئة فرشاة القماش على شفاف
ACanvas.Brush.Style:=bsClear;
// إخراج النص في القائمة
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
نهاية؛
الإجراء TForm1.Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
يبدأ
// تغيير عرض القائمة وارتفاعها في حدث OnMeasureItem. البرامج الخمسة التالية هي نفسها
// قم بتغيير عرض القائمة وارتفاعها لاستيعاب النص
الارتفاع:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Width:=Width+iW; // تغيير عرض القائمة بناءً على الحساب لاستيعاب النص الإضافي
نهاية؛
الإجراء TForm1.Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
يبدأ
الارتفاع:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
العرض: = العرض + iW؛
نهاية؛
الإجراء TForm1.Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
يبدأ
الارتفاع:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
العرض: = العرض + iW؛
نهاية؛
الإجراء TForm1.Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
يبدأ
الارتفاع:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
العرض: = العرض + iW؛
نهاية؛
الإجراء TForm1.Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
يبدأ
الارتفاع:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
العرض: = العرض + iW؛
نهاية؛
الإجراء TForm1.Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
فار العرض، الارتفاع: عدد صحيح)؛
يبدأ
الارتفاع:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
العرض: = العرض + iW؛
نهاية؛
الإجراء TForm1.Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
يبدأ
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption1');
نهاية؛
الإجراء TForm1.Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
يبدأ
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption2');
نهاية؛
الإجراء TForm1.Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
يبدأ
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption3');
نهاية؛
الإجراء TForm1.Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
يبدأ
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption4');
نهاية؛
الإجراء TForm1.Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
يبدأ
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption5');
نهاية؛
الإجراء TForm1.Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect المحدد: منطقي)؛
يبدأ
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption6');
نهاية؛
نهاية.