Percantik menu Anda dengan Delphi
Banyak program di Windows memiliki menu yang sangat indah, seperti Banner Windows yang panjang dari atas ke bawah di sisi kiri menu "Start" Windows, atau ada ikon kecil di sisi kiri setiap bilah menu seperti Word Melihat ini menu keren, apakah menurut Anda menu sendiri terlihat membosankan? Tidak diperlukan kontrol pihak ketiga, dan fungsi di atas dapat dicapai dengan menggunakan Delphi.
Jika Anda ingin mengimplementasikan menu kustom, Anda perlu mengubah ukuran menu saat menggambar menu agar sesuai dengan grafik yang digambar pada menu, lalu menggambar efek menu yang Anda perlukan. Di Delphi, setiap item menu berhubungan dengan kontrol TmenuItem. Jenis kontrol ini memiliki dua kejadian: OnDrawItem dan OnMeasureItem. Untuk mengimplementasikan menu kustom, Anda harus memperkenalkan dua kejadian berikut terlebih dahulu:
Peristiwa OnMeasureItem didefinisikan sebagai berikut:
ketik TMenuMeasureItemEvent = PROcedure (Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer) objek;
properti OnMeasureItem: TMenuMeasureItemEvent;
Peristiwa ini dihasilkan ketika bilah menu memantau ukurannya sendiri. Parameter Acanvas mendefinisikan objek gambar yang akan digambar, dan parameter Lebar dan Tinggi menentukan ukuran default item menu artinya Anda dapat menggunakan event OnMeasureItem Mengubah kedua nilai ini pada fungsi pemrosesan berarti mengubah ukuran menu.
Acara OnDrawItem didefinisikan sebagai berikut:
ketik TMenuDrawItemEvent = prosedur (Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean) objek;
properti OnDrawItem: TMenuDrawItemEvent;
Peristiwa ini dipicu ketika menu digambar. Parameter Acanvas mendefinisikan objek gambar menu, parameter Arect menentukan area gambar menu, dan parameter Selected menentukan apakah item menu saat ini dipilih.
Seperti yang dapat Anda lihat dari pendahuluan di atas, untuk mengimplementasikan menu yang disesuaikan, Anda hanya perlu menulis kode di event OnMeasureItem untuk mengubah ukuran item menu, lalu menggambar efek yang Anda perlukan di event OnDrawItem.
Di bawah ini saya akan memberikan contoh spesifik untuk ilustrasinya. Contoh ini adalah membuat menu Anda sendiri menampilkan fungsi Banner bar seperti menu Start Windows. Pada saat yang sama, program ini juga dapat mengisi bilah menu yang dipilih dengan warna gradien (seperti menu bilah tugas pada perangkat lunak situs web 3721 Cina). Ide dari program ini adalah: pertama buat bitmap panjang, lalu ubah lebar dan tinggi item menu di event OnMeasureItem setiap bilah menu sesuai dengan teks dan gambar yang akan ditampilkan pada menu dan kebutuhan. program, lalu Salin bagian bitmap yang sesuai ke item menu di acara OnDrawItem. Jika bilah menu dipilih, pertama-tama ubah warna kuas parameter Acanvas, lalu isi bagian bilah menu yang sesuai secara bergantian, sehingga mewujudkan pengisian warna gradien pada bilah menu yang dipilih. Terakhir, teks ditampilkan ke bilah menu.
Mari kita perkenalkan prosedur spesifiknya. Pertama, gunakan perangkat lunak gambar untuk membuat file bitmap yang panjang (Anda dapat mengatur rasio aspek gambar sesuai kebutuhan Anda, pada gambar saya adalah 10:1). Buat proyek baru di Delphi, tambahkan kontrol TImage ke Form1, dan atur properti AutoSize kontrol ke True. Kemudian tambahkan kontrol TMainMenu ke Form1, atur properti OwnerDraw ke True (ini sangat penting, jika tidak, program tidak dapat diimplementasikan) dan tambahkan 6 objek TMenuItem di bawah TMainMenu (klik kanan kontrol TMainMenu, lalu klik pada pop- menu item Menu Designer, Anda dapat menambahkan bilah menu di jendela desain), atur properti Nama mereka ke Caption1, Caption2, ..., Caption6 masing-masing.
Berikut ini adalah daftar program spesifik:
Menu Pemilik unit;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog,
Menu, ExtCtrls, StdCtrls, ImgList;
jenis
TForm1 = kelas(TForm)
Menu Utama1: Menu Utama;
Utama1: TMenuItem;
Keterangan1: TMenuItem;
Keterangan2: TMenuItem;
Keterangan3: TMenuItem;
Keterangan4: TMenuItem;
Keterangan5: TMenuItem;
Keterangan6: TMenuItem;
Gambar1: Gambar;
procedure Caption1MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
procedure Caption2MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
procedure Caption3MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
procedure Caption4MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
procedure Caption5MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
procedure Caption6MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
procedure Caption1DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
procedure Caption2DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
procedure Caption3DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
procedure Caption4DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
procedure Caption5DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
procedure Caption6DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
pribadi
{Deklarasi pribadi}
publik
prosedur DrawItem(Pengirim: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Dipilih: Boolean;strOUT:String);
{Pernyataan publik}
akhir;
var
Formulir1: TForm1;
i,iH,Ind,iW,iRate:Bilangan Bulat;
rTemp: Benar;
iG1,iG2:Bilangan Bulat;
pelaksanaan
{$R *.DFM}
procedure TForm1.DrawItem(Pengirim: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Dipilih: Boolean;strOut:String);
var
j:Bilangan Bulat;
mulai
i:=ARect.Bottom -ARect.Top; //Dapatkan tinggi dan lebar tekstur
Ind:=Pengirim.MenuIndex;
iH:=Round(Image1.Height/6*Ind); //Dapatkan posisi tekstur
//Salin bitmap pada posisi yang sesuai pada Gambar ke menu
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Gambar1.Lebar,Bulat(Gambar1.Tinggi/6),SRCCOPY);
jika Dipilih maka mulai //Item menu dipilih
ACanvas.Font.Warna := clPutih;
rTemp:=ARect;
rTemp.Kiri := rTemp.kiri+iW;
iG1:=Bulat((rTemp.Kanan - rTemp.Kiri)/10);
rTemp.Kanan := rTemp.Kiri +iG1;
untuk j:= 0 hingga 9 mulai //Atur efek gradien warna melalui loop
ACanvas.Kuas.Warna := RGB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.Kiri := rTemp.Kiri +iG1;
rTemp.Kanan := rTemp.Kiri +iG1;
akhir;
akhir
else start //Item menu ini tidak dipilih
ACanvas.Brush.Color := cl3DLight; //Atur warna latar belakang menjadi abu-abu terang
rTemp:=ARect;
rTemp.Kiri := rTemp.kiri+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Warna := clHitam;
akhir;
//Atur mode pengisian kuas Canvas menjadi transparan
ACanvas.Brush.Style:=bsClear;
//Menampilkan teks pada menu
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
akhir;
procedure TForm1.Caption1MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
mulai
//Ubah lebar dan tinggi menu di event OnMeasureItem. Lima program berikut ini sama
//Ubah lebar dan tinggi menu untuk menampung teks
Tinggi:=ACanvas.TextHeight('Caption1')+5;
Lebar:=ACanvas.TextWidth('Caption1')+5;
iRate:=Bulat(Gambar1.Tinggi/(Tinggi*6));
iW:=Bulat(Gambar1.Lebar /iRate);
Lebar:=Lebar+iW; //Ubah lebar menu berdasarkan perhitungan untuk mengakomodasi teks tambahan
akhir;
procedure TForm1.Caption2MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
mulai
Tinggi:=ACanvas.TextHeight('Caption1')+5;
Lebar:=ACanvas.TextWidth('Caption1')+5;
iRate:=Bulat(Gambar1.Tinggi/(Tinggi*6));
iW:=Bulat(Gambar1.Lebar /iRate);
Lebar:=Lebar+iW;
akhir;
procedure TForm1.Caption3MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
mulai
Tinggi:=ACanvas.TextHeight('Caption1')+5;
Lebar:=ACanvas.TextWidth('Caption1')+5;
iRate:=Bulat(Gambar1.Tinggi/(Tinggi*6));
iW:=Bulat(Gambar1.Lebar /iRate);
Lebar:=Lebar+iW;
akhir;
procedure TForm1.Caption4MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
mulai
Tinggi:=ACanvas.TextHeight('Caption1')+5;
Lebar:=ACanvas.TextWidth('Caption1')+5;
iRate:=Bulat(Gambar1.Tinggi/(Tinggi*6));
iW:=Bulat(Gambar1.Lebar /iRate);
Lebar:=Lebar+iW;
akhir;
procedure TForm1.Caption5MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
mulai
Tinggi:=ACanvas.TextHeight('Caption1')+5;
Lebar:=ACanvas.TextWidth('Caption1')+5;
iRate:=Bulat(Gambar1.Tinggi/(Tinggi*6));
iW:=Bulat(Gambar1.Lebar /iRate);
Lebar:=Lebar+iW;
akhir;
procedure TForm1.Caption6MeasureItem(Pengirim: TObject; ACanvas: TCanvas;
var Lebar, Tinggi: Integer);
mulai
Tinggi:=ACanvas.TextHeight('Caption1')+5;
Lebar:=ACanvas.TextWidth('Caption1')+5;
iRate:=Bulat(Gambar1.Tinggi/(Tinggi*6));
iW:=Bulat(Gambar1.Lebar /iRate);
Lebar:=Lebar+iW;
akhir;
procedure TForm1.Caption1DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
mulai
DrawItem(TMenuItem(Pengirim),ACanvas,ARect,Dipilih,'Caption1');
akhir;
procedure TForm1.Caption2DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
mulai
DrawItem(TMenuItem(Pengirim),ACanvas,ARect,Dipilih,'Caption2');
akhir;
procedure TForm1.Caption3DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
mulai
DrawItem(TMenuItem(Pengirim),ACanvas,ARect,Dipilih,'Caption3');
akhir;
procedure TForm1.Caption4DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
mulai
DrawItem(TMenuItem(Pengirim),ACanvas,ARect,Dipilih,'Caption4');
akhir;
procedure TForm1.Caption5DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
mulai
DrawItem(TMenuItem(Pengirim),ACanvas,ARect,Dipilih,'Caption5');
akhir;
procedure TForm1.Caption6DrawItem(Pengirim: TObject; ACanvas: TCanvas;
ARect: TRect; Dipilih: Boolean);
mulai
DrawItem(TMenuItem(Pengirim),ACanvas,ARect,Dipilih,'Caption6');
akhir;
akhir.