Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Über leiste minimieren (https://www.delphipraxis.net/19531-ueber-leiste-minimieren.html)

DeMo 5. Apr 2004 09:32


Über leiste minimieren
 
Hoi leude

Also ich möchte ien Prog schreiben! Das ebi einen Doubleclick auf die Leiste des Programs sich minimiert also das dann nur noch die Leiste zu sehen ist ! Halt so wie bei Winamp und Trillian z.B.;

Wie stelle ich das an ? :gruebel: Normalerweise Maximiert das prog ja wen man Doubleclick auf die Leiste macht !
Danke im vorraus !

MFG DeMo

Christian Seehase 5. Apr 2004 17:31

Re: Über leiste minimieren
 
Moin DeMo,

Du fängst die entsprechenden Messages ab (WM_SYSCOMMAND mit SC_MAXIMIZE, und WM_NCLBUTTONDBLCLK) und leitest ein WM_SYSCOMMAND mit SC_MINIMIZE weiter.

Smokey 5. Apr 2004 17:36

Re: Über leiste minimieren
 
Das ist genau die Antwort, die ein Neueinsteiger braucht um klarzukommen :wink:

Christian Seehase 5. Apr 2004 17:39

Re: Über leiste minimieren
 
Moin Smokey,

Zitat:

Zitat von Smokey
Das ist genau die Antwort, die ein Neueinsteiger braucht um klarzukommen :wink:

und woraus schliesst Du, dass DeMo ein solcher ist :gruebel: ;-)

DeMo 29. Mai 2004 10:57

Re: Über leiste minimieren
 
also der smokey hat schon recht ich bin ein neueinsteiger und ich bräuchte eine etwas plausieblere erklärung ^^
aba trotzdem danke wengisten weiß ich jetzt schon was! trotsdem weiß ich nicht wie ich die nachrichten abfangen soll und was ich mit dennen anfangen soll :oops: !
mfg DeMo

Christian Seehase 29. Mai 2004 14:15

Re: Über leiste minimieren
 
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.

DeMo 29. Mai 2004 15:35

Re: Über leiste minimieren
 
danke sehr, hast mir wirklich geholfen ! !

werde es gleich mal ausprobieren !

mfg DeMo

DeMo 29. Mai 2004 16:32

Re: Über leiste minimieren
 
so ich habe es ausprobiert ! und bei der ersten Variante gab es ein Fehler doch die zweite geht einwandfrei ,doch leider ist es nicht ganz das was ich wollte !

Also hier nochmal was ich will!

Beim doppelklick auf die Leiste des programms soll das programm net in die WindowsLeiste minimiert werden sondern, von dem programm soll dann halt nur die Leiste zusehen sein! Aba das nciht weiter schlimm da ich durch deine hilfe es jetzt so auch hinbekomme hier der code:

Delphi-Quellcode:
procedure TForm1.WMNclButtonDblClk(var msg: TMessage);
begin
 if Form1.ClientHeight = 114 then begin
    Form1.ClientHeight:= 0;
 end else begin
    Form1.ClientHeight:= 114;
 end;
end;
:hello:
Also danke nochmal

alcaeus 29. Mai 2004 17:05

Re: Über leiste minimieren
 
Der Code ist gut, allerdings funktioniert er nicht mehr einwandfrei, wenn du die Größe des Formulars änderst. Deshalb könntest du auch folgendes verwenden:
Delphi-Quellcode:
procedure TForm1.WMNclButtonDblClk(var msg: TMessage);
begin
  if ClientHeight > 0 then
  begin
    Tag := ClientHeight;
    ClientHeight:= 0;
  end
  else
    ClientHeight:= Tag;
end;
In den Routinen für Form1 brauchst du das Form1. nicht explizit zu schreiben, der Compiler erledigt das für dich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz