ตกแต่งเมนูของคุณ ด้วย Delphi
หลายโปรแกรมใน Windows มีเมนูที่สวยงามมาก เช่น แบนเนอร์ Windows ยาวจากบนลงล่างทางด้านซ้ายของเมนู "Start" ของ Windows หรือมีไอคอนเล็กๆ ทางด้านซ้ายของแถบเมนูแต่ละแถบ เช่น Word Seeing เมนูเด็ดๆ เหล่านี้ รู้สึกว่าเมนูของตัวเองดูน่าเบื่อมั้ย? ไม่จำเป็นต้องมีการควบคุมจากบุคคลที่สาม และสามารถใช้ฟังก์ชันข้างต้นได้โดยใช้ Delphi
หากคุณต้องการใช้เมนูแบบกำหนดเอง คุณต้องเปลี่ยนขนาดของเมนูเมื่อวาดเมนูเพื่อปรับให้เข้ากับกราฟิกที่วาดบนเมนู จากนั้นจึงวาดเอฟเฟกต์เมนูที่คุณต้องการ ใน Delphi แต่ละรายการเมนูจะสอดคล้องกับตัวควบคุม TmenuItem ตัวควบคุมประเภทนี้มีสองเหตุการณ์: OnDrawItem และ OnMeasureItem หากต้องการใช้เมนูแบบกำหนดเอง คุณต้องแนะนำสองเหตุการณ์นี้ก่อน:
เหตุการณ์ OnMeasureItem ถูกกำหนดไว้ดังนี้:
พิมพ์ TMenuMeasureItemEvent = PROcedure (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม) ของวัตถุ;
คุณสมบัติ OnMeasureItem: TMenuMeasureItemEvent;
เหตุการณ์นี้เกิดขึ้นเมื่อแถบเมนูตรวจสอบขนาดของตัวเอง พารามิเตอร์ Acanvas กำหนดวัตถุรูปวาดที่จะวาด และพารามิเตอร์ ความกว้าง และ ความสูง ระบุขนาดเริ่มต้นของรายการเมนู หมายความว่าคุณสามารถใช้เหตุการณ์ OnMeasureItem ได้ การเปลี่ยนค่าทั้งสองนี้ในฟังก์ชันการประมวลผลหมายถึงการเปลี่ยนขนาดของเมนู
เหตุการณ์ OnDrawItem ถูกกำหนดไว้ดังนี้:
ประเภท TMenuDrawItemEvent = ขั้นตอน (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: บูลีน) ของวัตถุ;
คุณสมบัติ OnDrawItem: TMenuDrawItemEvent;
เหตุการณ์นี้จะเกิดขึ้นเมื่อมีการวาดเมนู พารามิเตอร์ Acanvas กำหนดวัตถุการวาดเมนู พารามิเตอร์ Arect ระบุพื้นที่การวาดของเมนู และพารามิเตอร์ Selected กำหนดว่ารายการเมนูปัจจุบันถูกเลือกหรือไม่
ดังที่คุณเห็นจากบทนำข้างต้น หากต้องการใช้เมนูแบบกำหนดเอง คุณจะต้องเขียนโค้ดในเหตุการณ์ OnMeasureItem เพื่อเปลี่ยนขนาดของรายการเมนู จากนั้นจึงวาดเอฟเฟกต์ที่คุณต้องการในเหตุการณ์ OnDrawItem
ด้านล่างนี้ฉันจะยกตัวอย่างเฉพาะเพื่อแสดงให้เห็นภาพ ตัวอย่างนี้คือการทำให้เมนูของคุณเองแสดงฟังก์ชันแถบแบนเนอร์ เช่น เมนู Start ของ Windows ในเวลาเดียวกัน โปรแกรมนี้ยังสามารถเติมแถบเมนูที่เลือกด้วยการไล่ระดับสีได้ (เช่นเดียวกับเมนูแถบงานของซอฟต์แวร์เว็บไซต์ภาษาจีน 3721) แนวคิดของโปรแกรมคือ ขั้นแรกให้สร้างบิตแมปแบบยาว จากนั้นเปลี่ยนความกว้างและความสูงของรายการเมนูในเหตุการณ์ OnMeasureItem ของแต่ละแถบเมนูตามข้อความและรูปภาพที่จะแสดงบนเมนูและความต้องการ ของโปรแกรม แล้วคัดลอกส่วนที่เกี่ยวข้องของบิตแมปไปยังรายการเมนูในเหตุการณ์ OnDrawItem หากเลือกแถบเมนู ขั้นแรกให้เปลี่ยนสีแปรงของพารามิเตอร์ Acanvas จากนั้นเติมส่วนที่เกี่ยวข้องของแถบเมนูตามลำดับ เพื่อให้เกิดการเติมสีไล่ระดับสีของแถบเมนูที่เลือก ในที่สุด ข้อความก็จะถูกส่งไปที่แถบเมนู
เรามาแนะนำขั้นตอนเฉพาะกัน ขั้นแรก ให้ใช้ซอฟต์แวร์รูปภาพเพื่อสร้างไฟล์บิตแมปขนาดยาว (คุณสามารถกำหนดอัตราส่วนของรูปภาพได้ตามความต้องการ ในรูปภาพของฉันคือ 10:1) สร้างโครงการใหม่ใน Delphi เพิ่มตัวควบคุม TImage ให้กับ Form1 และตั้งค่าคุณสมบัติ AutoSize ของตัวควบคุมเป็น True จากนั้นเพิ่มตัวควบคุม TMainMenu ให้กับ Form1 ตั้งค่าคุณสมบัติ OwnerDraw เป็น True (ซึ่งเป็นสิ่งสำคัญมาก ไม่เช่นนั้นโปรแกรมจะไม่สามารถใช้งานได้) และเพิ่มอ็อบเจ็กต์ TMenuItem 6 รายการภายใต้ TMainMenu (คลิกขวาที่ตัวควบคุม TMainMenu จากนั้นคลิกที่ป๊อปอัป เมนูขึ้น รายการตัวออกแบบเมนู คุณสามารถเพิ่มแถบเมนูในหน้าต่างการออกแบบ) ตั้งค่าคุณสมบัติชื่อเป็น Caption1, Caption2, ..., Caption6 ตามลำดับ
ต่อไปนี้เป็นรายการโปรแกรมเฉพาะ:
เมนูเจ้าของหน่วย;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ,
เมนู, ExtCtrls, StdCtrls, ImgList;
พิมพ์
TForm1 = คลาส (TForm)
เมนูหลัก1: TMainMenu;
Main1: TMenuItem;
คำอธิบายภาพ 1: TMenuItem;
คำบรรยายภาพ 2: TMenuItem;
คำบรรยายภาพ 3: TMenuItem;
คำบรรยายภาพ 4: TMenuItem;
คำบรรยายภาพ 5: TMenuItem;
คำบรรยายภาพ 6: TMenuItem;
ภาพที่ 1: TImage;
ขั้นตอน Caption1MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
ขั้นตอน Caption2MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
ขั้นตอน Caption3MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
ขั้นตอน Caption4MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
ขั้นตอน Caption5MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
ขั้นตอน Caption6MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
ขั้นตอน Caption1DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
ขั้นตอน Caption2DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
ขั้นตอน Caption3DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
ขั้นตอน Caption4DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
ขั้นตอน Caption5DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
ขั้นตอน Caption6DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
ขั้นตอน DrawItem (ผู้ส่ง: TMenuItem; ACanvas: TCanvas; ARect: TRect;
เลือกแล้ว: บูลีน;strOUT:String);
{ประกาศสาธารณะ}
จบ;
var
แบบฟอร์ม 1: TForm1;
i,iH,Ind,iW,iRate:จำนวนเต็ม;
rTemp:TRect;
iG1, iG2: จำนวนเต็ม;
การดำเนินการ
{$R *.DFM}
ขั้นตอน TForm1.DrawItem (ผู้ส่ง: TMenuItem; ACanvas: TCanvas; ARect: TRect;
เลือกแล้ว: บูลีน;strOut:String);
var
เจ:จำนวนเต็ม;
เริ่ม
i:=ARect.Bottom -ARect.Top; //รับความสูงและความกว้างของพื้นผิว
Ind:=Sender.MenuIndex;
iH:=Round(Image1.Height/6*Ind); // รับตำแหน่งพื้นผิว
//คัดลอกบิตแมปที่ตำแหน่งที่สอดคล้องกันบนรูปภาพไปยังเมนู
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Image1.ความกว้าง,รอบ(Image1.Height/6),SRCCOPY);
ถ้าเลือกแล้วให้เริ่มต้น // รายการเมนูถูกเลือก
ACanvas.Font.Color := clWhite;
rTemp:=ARect;
rTemp.ซ้าย := rTemp.left+iW;
iG1:=รอบ((rTemp.Right - rTemp.Left)/10);
rTemp.Right := rTemp.ซ้าย +iG1;
สำหรับ j:= 0 ถึง 9 ให้เริ่มต้น // ตั้งค่าเอฟเฟกต์การไล่ระดับสีผ่านการวนซ้ำ
ACanvas.Brush.Color := RGB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.ซ้าย := rTemp.ซ้าย +iG1;
rTemp.Right := rTemp.ซ้าย +iG1;
จบ;
จบ
อื่นเริ่มต้น // รายการเมนูนี้ไม่ได้ถูกเลือก
ACanvas.Brush.Color := cl3DLight; // ตั้งค่าสีพื้นหลังเป็นสีเทาอ่อน
rTemp:=ARect;
rTemp.ซ้าย := rTemp.left+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
จบ;
//ตั้งค่าโหมดการเติมแปรง Canvas ให้โปร่งใส
ACanvas.Brush.Style:=bsClear;
//ข้อความที่ส่งออกบนเมนู
ACanvas.TextOut(ARect.ซ้าย+iW+5,ARect.Top,strOut);
จบ;
ขั้นตอน TForm1.Caption1MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
เริ่ม
//เปลี่ยนความกว้างและความสูงของเมนูในเหตุการณ์ OnMeasureItem ห้าโปรแกรมต่อไปนี้จะเหมือนกัน
//เปลี่ยนความกว้างและความสูงของเมนูเพื่อรองรับข้อความ
ความสูง:=ACanvas.TextHeight('คำอธิบายภาพ1')+5;
ความกว้าง:=ACanvas.TextWidth('คำอธิบายภาพ1')+5;
iRate:=รอบ(รูปภาพ1.ความสูง/(ความสูง*6));
iW:=รอบ(Image1.Width /iRate);
ความกว้าง:=ความกว้าง+iW; //เปลี่ยนความกว้างของเมนูตามการคำนวณเพื่อรองรับข้อความเพิ่มเติม
จบ;
ขั้นตอน TForm1.Caption2MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
เริ่ม
ความสูง:=ACanvas.TextHeight('คำอธิบายภาพ1')+5;
ความกว้าง:=ACanvas.TextWidth('คำอธิบายภาพ1')+5;
iRate:=รอบ(รูปภาพ1.ความสูง/(ความสูง*6));
iW:=รอบ(Image1.Width /iRate);
ความกว้าง:=ความกว้าง+iW;
จบ;
ขั้นตอน TForm1.Caption3MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
เริ่ม
ความสูง:=ACanvas.TextHeight('คำอธิบายภาพ1')+5;
ความกว้าง:=ACanvas.TextWidth('คำอธิบายภาพ1')+5;
iRate:=รอบ(รูปภาพ1.ความสูง/(ความสูง*6));
iW:=รอบ(Image1.Width /iRate);
ความกว้าง:=ความกว้าง+iW;
จบ;
ขั้นตอน TForm1.Caption4MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
เริ่ม
ความสูง:=ACanvas.TextHeight('คำอธิบายภาพ1')+5;
ความกว้าง:=ACanvas.TextWidth('คำอธิบายภาพ1')+5;
iRate:=รอบ(รูปภาพ1.ความสูง/(ความสูง*6));
iW:=รอบ(Image1.Width /iRate);
ความกว้าง:=ความกว้าง+iW;
จบ;
ขั้นตอน TForm1.Caption5MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
เริ่ม
ความสูง:=ACanvas.TextHeight('คำอธิบายภาพ1')+5;
ความกว้าง:=ACanvas.TextWidth('คำอธิบายภาพ1')+5;
iRate:=รอบ(รูปภาพ1.ความสูง/(ความสูง*6));
iW:=รอบ(Image1.Width /iRate);
ความกว้าง:=ความกว้าง+iW;
จบ;
ขั้นตอน TForm1.Caption6MeasureItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
var ความกว้าง ความสูง: จำนวนเต็ม);
เริ่ม
ความสูง:=ACanvas.TextHeight('คำอธิบายภาพ1')+5;
ความกว้าง:=ACanvas.TextWidth('คำอธิบายภาพ1')+5;
iRate:=รอบ(รูปภาพ1.ความสูง/(ความสูง*6));
iW:=รอบ(Image1.Width /iRate);
ความกว้าง:=ความกว้าง+iW;
จบ;
ขั้นตอน TForm1.Caption1DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
เริ่ม
DrawItem(TMenuItem(ผู้ส่ง),ACanvas,ARect,เลือกแล้ว,'Caption1');
จบ;
ขั้นตอน TForm1.Caption2DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
เริ่ม
DrawItem(TMenuItem(ผู้ส่ง),ACanvas,ARect,เลือกแล้ว,'Caption2');
จบ;
ขั้นตอน TForm1.Caption3DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
เริ่ม
DrawItem(TMenuItem(ผู้ส่ง),ACanvas,ARect,เลือกแล้ว,'คำบรรยายภาพ3');
จบ;
ขั้นตอน TForm1.Caption4DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
เริ่ม
DrawItem(TMenuItem(ผู้ส่ง),ACanvas,ARect,เลือกแล้ว,'Caption4');
จบ;
ขั้นตอน TForm1.Caption5DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
เริ่ม
DrawItem(TMenuItem(ผู้ส่ง),ACanvas,ARect,เลือกแล้ว,'คำบรรยาย5');
จบ;
ขั้นตอน TForm1.Caption6DrawItem (ผู้ส่ง: TObject; ACanvas: TCanvas;
ARect: TRect; เลือกแล้ว: บูลีน);
เริ่ม
DrawItem(TMenuItem(ผู้ส่ง),ACanvas,ARect,เลือกแล้ว,'คำบรรยายภาพ6');
จบ;
จบ.