Systemmenü verkleinern |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 06.03.2011 |
Aus dem Systemmenü können Menüpunkte problemlos gelöscht werden. Die entscheidene Funktion ist DeleteMenu, die als zweiten Parameter die Nummer des Menüpunkts erwartet. Die Menüpunkte sind von oben nach unten beginnend bei 0 durchnummeriert. Löscht man beispielsweise den obersten Menüpunkt (Nummer: 0) rutschen die unteren Menüpunkte auch mit der Nummerierung nach oben.
Folgende Prozedur löscht den Schließen-Eintrag (Nummer: 6) und den Menütrennstrich (Nummer: 5) aus dem Systemmenü einer Anwendung:
procedure TForm1.Button1Click(Sender: TObject);
var
Handle: THandle;
begin
Handle := GetSystemMenu(Self.Handle, False);
if Handle<>0 then
begin
if not DeleteMenu(Handle, 6, MF_BYPOSITION) then
RaiseLastOSError;
if not DeleteMenu(Handle, 5, MF_BYPOSITION) then
RaiseLastOSError;
end;
end;
Da sich die Reihenfolge durch das Löschen und Hinzufügen von Einträgen während des Programmablaufs ändern kann, gibt es auch die Möglichkeit die Menüeintrage anhand ihrer ID-Nummer zu identifizieren.Die IDs der Menüeinträge sind bereits in der Windows.pas als Konstanten deklariert. Hier die wichtigsten Konstanten:
SC_MOVE = Verschieben
SC_SIZE = Größe ändern
SC_MINIMIZE = Minimieren
SC_MAXIMIZE = Maximieren
SC_CLOSE = Schließen
Der Menüteiler hat die ID 0.
Mithilfe des Parameters MF_BYCOMMAND werden die Menüeinträge über ihre ID gelöscht. Dazu muss die entsprechende Konstante dem zweiten Parameter übergeben werden:
procedure TForm1.Button1Click(Sender: TObject);
var
Handle: THandle;
begin
Handle := GetSystemMenu(Self.Handle, False);
if Handle<>0 then
begin
if not DeleteMenu(Handle, SC_CLOSE, MF_BYCOMMAND) then
RaiseLastOSError;
end;
end;
RaiseLastOSError ist erst ab Delphi 6 verfügbar. Programmierer, die mit älteren Versionen arbeiten müssen an dieser Stelle RaiseLastWin32Error verwenden.Wie sie das Systemmenü erweitern, können Sie unter den Verweisen lesen.