Thema: Delphi Über leiste minimieren

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Über leiste minimieren

  Alt 29. Mai 2004, 15:15
Moin DeMo,

dann will ich mal mein Glück versuchen

Ganz allgemein:
Um Messages abzufangen, die an ein Fenster gesendet werden, kann man die WndProc (Window Procedure) überschreiben, und dann dort alles filtern und entsprechend reagieren, wie man es gerne hätte.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WndProc(var msg : TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WndProc(var msg: TMessage);
begin
  // Message WM_SYSCOMMAND abfangen
  if msg.Msg = WM_SYSCOMMAND then begin
    // Wenn Maximiert werden soll
    if msg.WParam = SC_MAXIMIZE then begin
      // auf minimiert umschalten
      msg.WParam := SC_MINIMIZE;
    end;
  end else begin
    // Doppelclick auf die Titelleiste?
    if msg.Msg = WM_NCLBUTTONDBLCLK then begin
      // dann die Message auf mimimieren ändern
      msg.Msg := WM_SYSCOMMAND;
      msg.WParam := SC_MINIMIZE;
    end;
  end;
  // WICHTIG:
  // Die eigentliche WndProc mit den ggf. geänderten
  // Werten aufrufen
  inherited;
end;
Eine andere Möglichkeit, vielleicht etwas übersichtlicher, ist es sich direkt für die verschiedenen Messages Verarbeitungsmethoden anzulegen:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WMSysCommand(var msg : TMessage); message WM_SYSCOMMAND;
    procedure WMNclButtonDblClk(var msg : TMessage); message WM_NCLBUTTONDBLCLK;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMNclButtonDblClk(var msg: TMessage);
begin
  // Wenn ein Doppelclick auf die Titelzeile erkannt wird
  // Minimieren anfordern
  SendMessage(self.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
  // WICHTIG:
  // Hier darf nicht die Messageverarbeitung mit inherited aufgerufen werden,
  // da die urprüngliche Message dann nicht unterdrückt wird.
end;

procedure TForm1.WMSysCommand(var msg: TMessage);
begin
  // Wenn Maximierung angefordert wird auf minimieren ändern
  if msg.WParam = SC_MAXIMIZE then msg.WParam := SC_MINIMIZE;
  // und weiterverarbeiten
  inherited;
end;
Anmerkung:
In einer Methode entspricht self immer dem Objekt zu dem die Methode gehört. Hier sind es Methoden des Objektes Form1, so dass self.Handle das Handle des Formulares Form1 enthält.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat