Menüs

Wie man ein Bitmap in einem Menü anzeigt

Erstelle ein TBitmap und lade eine Grafik in das Bitmap. Benutze die API-Funktion "SetMenuItemBitmaps", um das Bitmap mit dem MenüItem zu verknüpfen:

var   Bmp1 : TPicture;
...
  Bmp1 := TPicture.Create;
  Bmp1.LoadFromFile('c:\where\b1.BMP');
  SetMenuItemBitmaps(MenuItemTest.Handle, 0, MF_BYPOSITION,
                     Bmp1.Bitmap.Handle, Bmp1.Bitmap.Handle);
...
- MenuItemTest ist der Name des MainMenu-Items
- 0,1 ... ist die Position des MenüItems im Menü. (Die Zählung beginnt mit 0)
- Das erste der Bitmap-Handles ist das für den "Unchecked"-Zustand des MenüItems.
- Das zweite der Bitmap-Handles ist das für den "Checked"-Zustand des MenüItems. Die Handles können (wie im Beispiel) gleich sein, oder zwei unterschiedliche Bitmaps bezeichnen.

Nach Klick auf welche Komponente wurde ein Popup-Menü aufgerufen?

Wie ermittelt man die Komponente, auf die mit der rechten Maustaste geklickt wurde, um ein Popup-Menü aufzurufen?

Oft wird ein Popup-Menü mehreren Komponenten zugewiesen, man möchte dann aber wissen, auf welche der Komponenten mit der rechten Maustaste geklickt wurde, um das Popup-Menü aufzurufen. Diese Komponente wird in der Eigenschaft "PopupComponent" des Popup-Menüs gespeichert:

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  Label1.Caption:=PopupMenu1.PopupComponent.Name;
end;

Wie kann man einen horizontalen Trennstrich in ein Menü einfügen?

Wie kann ich in einem Menü horizontale Trennstriche zwischen den einzelnen MenuItems anzeigen, wie man das in fast jeder Anwendung sieht?

Die Lösung dieses Problem ist -wie so oft- sehr einfach, aber in der Onlinehilfe gar nicht oder nur sehr schwierig zu finden: Jeder Trennstrich ist ein einzelnes MenuItem mit einem "-" (Minuszeichen) als Caption.

Wie kann man dem Systemmenü eines Fensters einen Menüpunkt hinzufügen?

In diesem Beispiel wird dem Systemmenü des Fensters "Form1" der Menüpunkt "Beep!" hinzugefügt. Nach einem Click auf diesen Menüpunkt ertönt ein kurzer Piepton.

Zuerst fügt zu man den privaten Deklarationen des Formulars die Methode "WMSysCommand" hinzu:

type
  TForm1 = class(TForm);
...
  private
    procedure WMSysCommand(VAR Message: TWMSysCommand);
      message WM_SYSCOMMAND;
...
Die Implementation dieser Methode sieht dann so aus:

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
  Inherited;
  if Message.CmdType and $FFF0 = $F200 then
    {Hier steht der Code, der mit dem neuen Menüpunkt
     ausgeführt werden soll:}
    MessageBeep(0);
end;
Nun muß man in der OnCreate-Methode des Formulars noch den entsprechenden Menüpunkt und eine ID-Nummer für die auszuführende Methode erzeugen. Hier wird der Menüpunkt "Beep!" mit der Kommando-ID $F200 erstellt:

procedure TForm1.FormCreate(Sender: TObject);
begin
  AppendMenu(GetSystemMenu(Handle, False), MF_STRING,
    $F200, '&Beep!');
end;
Die Funktion "Appendmenü" hängt den neuen Menüpunkt ans Ende des Systemmenüs an. Wenn man den neuen Menüpunkt an einer anderen Stelle einfügen will, benutzt man die Funktion "InsertMenu".

Die Kommando-ID $F200 ist ein (fast) beliebiger Wert größer als die normalen SC_xxxx-Konstanten. Die Kommando-ID für ein Systemkommando muß durch 16 teilbar sein, weil Windows die untersten 4 Bits der ID benutzt. Das ist auch der Grund, warum der Wert bei der Abfrage mit $FFF0 logisch und-verknüpft wird.

Wie kann man Menüeinträge rechtsbündig anordnen?

Mit der folgenden Prozedur "AlignMenuRight" kann man alle Menüeinträge ab "AbItem" rechtsbündig anordnen. Hat man also z.B. die Menüeinträge [Datei] [Bearbeiten] [Suchen] [?] und möchte das Hilfe-Menü immer am rechten Formularrand haben, ruft man die Prozedur (am besten im OnCreate-Handler der Form) wie folgt auf:

  AlignMenuRight(3, Self);

procedure AlignMenuRight(AbItem: Integer; Form: TForm);
var m : TMenuItemInfo;
    h : hMenu;
    s : shortstring;
begin
  h:=GetMenu(Form.Handle);
  m.cbSize:=SizeOf(m);
  m.cch:=SizeOf(s);
  m.dwTypeData:=pchar(@s[1]);
  m.fMask:=MIIM_TYPE;

  GetMenuItemInfo(h,AbItem,true,m);

  m.ftype:=m.ftype or MFT_RIGHTJUSTIFY;

  SetMenuItemInfo(h,AbItem,true,m);
end; {Mario Mueller}