Verschönern Sie Ihr Menü mit Delphi
Viele Programme unter Windows haben sehr schöne Menüs, wie zum Beispiel das lange Windows-Banner von oben nach unten auf der linken Seite des Windows-Startmenüs, oder es gibt ein kleines Symbol auf der linken Seite jeder Menüleiste wie bei Word Coole Menüs, finden Sie, dass Ihr eigenes Menü langweilig aussieht? Es sind keine Steuerelemente von Drittanbietern erforderlich und die oben genannten Funktionen können mit Delphi erreicht werden.
Wenn Sie ein benutzerdefiniertes Menü implementieren möchten, müssen Sie beim Zeichnen des Menüs die Größe des Menüs ändern, um sie an die im Menü gezeichneten Grafiken anzupassen, und dann den gewünschten Menüeffekt darauf zeichnen. In Delphi entspricht jedes Menüelement einem TmenuItem-Steuerelement. Dieser Steuerelementtyp verfügt über zwei Ereignisse: OnDrawItem und OnMeasureItem. Um ein benutzerdefiniertes Menü zu implementieren, müssen Sie zunächst diese beiden Ereignisse einführen.
Das OnMeasureItem-Ereignis ist wie folgt definiert:
type TMenuMeasureItemEvent = PRocedure (Sender: TObject; ACanvas: TCanvas;
var (Breite, Höhe: Ganzzahl) des Objekts;
Eigenschaft OnMeasureItem: TMenuMeasureItemEvent;
Dieses Ereignis wird generiert, wenn die Menüleiste ihre eigene Größe überwacht. Der Parameter Acanvas definiert das zu zeichnende Zeichenobjekt und die Parameter Breite und Höhe geben die Standardgröße des Menüelements an bedeutet, dass Sie das OnMeasureItem-Ereignis verwenden können. Das Ändern dieser beiden Werte in der Verarbeitungsfunktion bedeutet, dass sich die Größe des Menüs ändert.
Das OnDrawItem-Ereignis ist wie folgt definiert:
type TMenuDrawItemEvent = procedure (Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean) des Objekts;
Eigenschaft OnDrawItem: TMenuDrawItemEvent;
Dieses Ereignis wird ausgelöst, wenn das Menü gezeichnet wird. Der Parameter Acanvas definiert das Menüzeichnungsobjekt, der Parameter Arect gibt den Zeichenbereich des Menüs an und der Parameter Selected definiert, ob der aktuelle Menüpunkt ausgewählt ist.
Wie Sie der obigen Einführung entnehmen können, müssen Sie zum Implementieren eines benutzerdefinierten Menüs nur Code in das OnMeasureItem-Ereignis schreiben, um die Größe der Menüelemente zu ändern, und dann den gewünschten Effekt im OnDrawItem-Ereignis zeichnen.
Im Folgenden werde ich ein konkretes Beispiel zur Veranschaulichung geben. Dieses Beispiel dient dazu, dass Ihr eigenes Menü die Bannerleistenfunktion wie das Windows-Startmenü anzeigt. Gleichzeitig kann dieses Programm auch die ausgewählte Menüleiste mit Verlaufsfarben füllen (genau wie das Taskleistenmenü der chinesischen Website-Software 3721). Die Idee des Programms ist folgende: Erstellen Sie zunächst eine lange Bitmap und ändern Sie dann die Breite und Höhe der Menüelemente im OnMeasureItem-Ereignis jeder Menüleiste entsprechend dem im Menü anzuzeigenden Text und Bildern und den Anforderungen des Programms und kopieren Sie dann den entsprechenden Teil der Bitmap in den Menüpunkt im OnDrawItem-Ereignis. Wenn die Menüleiste ausgewählt ist, ändern Sie zunächst die Pinselfarbe des Acanvas-Parameters und füllen Sie dann nacheinander die entsprechenden Teile der Menüleiste aus, um so eine Farbverlaufsfüllung der ausgewählten Menüleiste zu realisieren. Abschließend wird der Text in der Menüleiste ausgegeben.
Lassen Sie uns das spezifische Verfahren vorstellen. Verwenden Sie zunächst eine Bildsoftware, um eine lange Bitmap-Datei zu erstellen (Sie können das Seitenverhältnis des Bildes entsprechend Ihren Anforderungen einstellen, in meinem Bild beträgt es 10:1). Erstellen Sie ein neues Projekt in Delphi, fügen Sie ein TImage-Steuerelement zu Form1 hinzu und setzen Sie die AutoSize-Eigenschaft des Steuerelements auf True. Fügen Sie dann ein TMainMenu-Steuerelement zu Form1 hinzu, setzen Sie seine OwnerDraw-Eigenschaft auf True (dies ist sehr wichtig, da das Programm sonst nicht implementiert werden kann) und fügen Sie 6 TMenuItem-Objekte unter dem TMainMenu hinzu (klicken Sie mit der rechten Maustaste auf das TMainMenu-Steuerelement und klicken Sie dann auf das Popup-Symbol). (Sie können dem Designfenster im Menü „Menü-Designer“ eine Menüleiste hinzufügen.) Legen Sie deren Namenseigenschaften auf „Caption1“, „Caption2“, „...“ und „Caption6“ fest.
Das Folgende ist eine spezifische Programmliste:
Einheit OwnerMenu;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge,
Menüs, ExtCtrls, StdCtrls, ImgList;
Typ
TForm1 = Klasse(TForm)
MainMenu1: TMainMenu;
Main1: TMenuItem;
Beschriftung1: TMenuItem;
Beschriftung2: TMenuItem;
Beschriftung3: TMenuItem;
Caption4: TMenuItem;
Caption5: TMenuItem;
Caption6: TMenuItem;
Bild1: TImage;
procedure Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
procedure Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
procedure Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
procedure Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
procedure Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
procedure Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
procedure Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
procedure Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
procedure Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
procedure Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
procedure Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
procedure Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
Privat
{Private Erklärungen}
öffentlich
procedure DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Ausgewählt: Boolean;strOUt:String);
{Öffentliche Erklärungen}
Ende;
var
Form1: TForm1;
i,iH,Ind,iW,iRate:Integer;
rTemp:TRect;
iG1,iG2:Integer;
Durchführung
{$R *.DFM}
procedure TForm1.DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Ausgewählt: Boolean;strOut:String);
var
j:Integer;
beginnen
i:=ARect.Bottom -ARect.Top; //Höhe und Breite der Textur abrufen
Ind:=Sender.MenuIndex;
iH:=Round(Image1.Height/6*Ind); //Texturposition abrufen
//Kopieren Sie die Bitmap an der entsprechenden Position im Bild in das Menü
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Image1.Width,Round(Image1.Height/6),SRCCOPY);
if Selected then begin //Der Menüpunkt ist ausgewählt
ACanvas.Font.Color := clWhite;
rTemp:=ARect;
rTemp.Left := rTemp.left+iW;
iG1:=Round((rTemp.Right - rTemp.Left)/10);
rTemp.Right := rTemp.Left +iG1;
for j:= 0 to 9 do begin // Farbverlaufseffekt durch Schleife festlegen
ACanvas.Brush.Color := RGB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.Left := rTemp.Left +iG1;
rTemp.Right := rTemp.Left +iG1;
Ende;
Ende
else begin //Dieser Menüpunkt ist nicht ausgewählt
ACanvas.Brush.Color := cl3DLight; //Setzen Sie die Hintergrundfarbe auf Hellgrau
rTemp:=ARect;
rTemp.Left := rTemp.left+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
Ende;
//Stellen Sie den Füllmodus des Canvas-Pinsels auf transparent ein
ACanvas.Brush.Style:=bsClear;
//Text im Menü ausgeben
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
Ende;
procedure TForm1.Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
beginnen
//Ändern Sie die Breite und Höhe des Menüs im OnMeasureItem-Ereignis. Die folgenden fünf Programme sind gleich
//Ändern Sie die Breite und Höhe des Menüs, um es an den Text anzupassen
Höhe:=ACanvas.TextHeight('Caption1')+5;
Breite:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Breite:=Breite+iW; //Ändern Sie die Menübreite basierend auf der Berechnung, um zusätzlichen Text aufzunehmen
Ende;
procedure TForm1.Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
beginnen
Höhe:=ACanvas.TextHeight('Caption1')+5;
Breite:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Breite:=Breite+iW;
Ende;
procedure TForm1.Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
beginnen
Höhe:=ACanvas.TextHeight('Caption1')+5;
Breite:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Breite:=Breite+iW;
Ende;
procedure TForm1.Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
beginnen
Höhe:=ACanvas.TextHeight('Caption1')+5;
Breite:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Breite:=Breite+iW;
Ende;
procedure TForm1.Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
beginnen
Höhe:=ACanvas.TextHeight('Caption1')+5;
Breite:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Breite:=Breite+iW;
Ende;
procedure TForm1.Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Breite, Höhe: Ganzzahl);
beginnen
Höhe:=ACanvas.TextHeight('Caption1')+5;
Breite:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Breite:=Breite+iW;
Ende;
procedure TForm1.Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
beginnen
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption1');
Ende;
procedure TForm1.Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
beginnen
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption2');
Ende;
procedure TForm1.Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
beginnen
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption3');
Ende;
procedure TForm1.Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
beginnen
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption4');
Ende;
procedure TForm1.Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
beginnen
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption5');
Ende;
procedure TForm1.Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Ausgewählt: Boolean);
beginnen
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption6');
Ende;
Ende.