55 Stimmen

Delphi/Lazarus: Schrift und Farbe von Menü oder PopupMenü ändern

Frage von Abensberger | 21.08.2017 um 14:24

Ich würde gerne das Aussehen der Menü-Items von meinem MainMenu und einem PopupMenu ändern. Leider haben weder das Menü selber noch die MenüItems eine Eigenschaft Font, um Einfluss auf das Erscheinungsbild zu nehmen.

Hat jemand eine Idee, wie ich den Style trotzdem ändern kann?

AntwortenPositivNegativ
3Beste Antwort3 Stimmen

Um die Schrift, die Farbe oder den Hintergrund vom TPopupMenu oder TMainMenu zu ändern, musst du die entsprechenden Items selber zeichnen.

Als erstes musst du die Eigenschaft "OwnerDraw" vom betreffenden PopupMenu oder MainMenu auf "true" setzen. Das kannst du auch einfach über den Object Inspector machen.

PopupMenu1.OwnerDraw := true;

Als nächstes musst du dich um das Zeichnen kümmern, das in der Prozedur OnDrawItem von jedem einzelnen TMenuItem durchgeführt wird. Dafür markierst du alle deiner Items nacheinander und machst jeweils einen Doppelklick auf das OnDrawItem-Event (du kannst natürlich auch jedem Item dieselbe Prozedur zuweisen, wenn alle Items gleich gezeichnet werden sollen). Die Prozedur gibt uns einen Zugang zu dem Canvas (hier mit der Variable ACanvas) jedes Items, auf den wir alles zeichnen und schreiben können, was wir möchten:

procedure TForm1.MenuItem11DrawItem(Sender: TObject; 
  ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
  s: string;
begin
  // Schrift ändern
  ACanvas.Font.Name := 'Consolas';
  ACanvas.Font.Size := 14;
  ACanvas.Font.Style := [fsBold];
  ACanvas.Font.Color := clYellow;
  // Hintergrund ändern
  ACanvas.Brush.Color := clBlack;
  ACanvas.Rectangle(ARect);
  // Caption/Text schreiben
  s := (Sender as TMenuItem).Caption;
  ACanvas.TextOut(ARect.Left + 2, ARect.Top + 2 , s);
end;

In diesem Beispiel ändern wir die Schriftart auf Consolas in Fett, Schriftgröße 14 und gelber Farbe mit einem schwarzen Hintergrund. Als Caption benutzen wir den String, der in der Eigenschaft "Caption" des MenuItems gespeichert steht und verwenden TextOut um den Text auf den Canvas zu schreiben. Natürlich können wir an dieser Stelle auch jeden einen Text hardcoden oder aus einer anderen Quelle beziehen.

Zusätzlich werden wir vermutlich die Prozedur OnMeasureItem jedes MenuItems benötigen. Diese Funktion teilt dem System mit, wie groß das MenuItem sein soll. Hier ist ein Beispiel:

procedure TForm1.MenuItem11MeasureItem(Sender: TObject; 
  ACanvas: TCanvas; var Width, Height: Integer);
var
  s: string;
begin
  // Breite und Höhe des MenüItems berechnen
  s := (Sender as TMenuItem).Caption;
  Width := ACanvas.TextWidth(s);
  Height := ACanvas.TextHeight(s);
end;

Die Prozedur stellt uns die Variablen Width und Height für das Item zur Verfügung, die wir auf jeden beliebigen Wert ändern können. In unserem Beispiel berechnen wir mit ACanvas.TextWidth und ACanvas.TextHeight (wir bekommen an dieser Stelle wieder den Canvas des Items mitgeliefert) die benötigte Breite und Höhe für den Text, sodass der Text genug Platz zur Verfügung hat. Natürlich können wir an dieser Stelle auch wieder einen festen Wert setzen oder eine andere Berechnung durchführen.
21.08.2017 um 15:39

AntwortenPositiv Negativ
Antworten

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.