![]() |
Ü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 |
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. |
Re: Über leiste minimieren
Das ist genau die Antwort, die ein Neueinsteiger braucht um klarzukommen :wink:
|
Re: Über leiste minimieren
Moin Smokey,
Zitat:
|
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 |
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:
Eine andere Möglichkeit, vielleicht etwas übersichtlicher, ist es sich direkt für die verschiedenen Messages Verarbeitungsmethoden anzulegen:
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;
Delphi-Quellcode:
Anmerkung:
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; 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. |
Re: Über leiste minimieren
danke sehr, hast mir wirklich geholfen ! !
werde es gleich mal ausprobieren ! mfg DeMo |
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:
:hello:
procedure TForm1.WMNclButtonDblClk(var msg: TMessage);
begin if Form1.ClientHeight = 114 then begin Form1.ClientHeight:= 0; end else begin Form1.ClientHeight:= 114; end; end; Also danke nochmal |
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:
In den Routinen für Form1 brauchst du das Form1. nicht explizit zu schreiben, der Compiler erledigt das für dich.
procedure TForm1.WMNclButtonDblClk(var msg: TMessage);
begin if ClientHeight > 0 then begin Tag := ClientHeight; ClientHeight:= 0; end else ClientHeight:= Tag; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz