![]() |
Fenster ausfahren
Ich erstelle ein Fenster und möchte dieses ausfahren und zwar so das es an der Top Position stehen bleibt.
Irgendwie will das mal wieder nicht. Wie kann ich das am besten bewerkstelligen. So ist meine Vorgehensweise.
Delphi-Quellcode:
WM_NCMOUSEMOVE:
begin GetClientRect(WinHandle, rc); GetCursorPos(p); ScreenToClient(WinHandle, p); if (p.y > 40) and (p.y < 128) then begin if Prop.Panel = 0 then Prop.Panel := CreatePanel(Prop.MainHandle); Prop.PanelHeight := 128; Prop.HeightOffset := Prop.PanelHeight; GetWindowRect(WinHandle, rc); MoveWindow(Prop.Panel, rc.left, rc.Top + 40, (rc.right - rc.left), Prop.PanelHeight, False); // << Das passt nicht möchte hier das Fenster rausfahren nicht komplett Anzeigen. ShowWindow(Prop.Panel, SW_SHOW); Prop.bPanel := True; end else begin if Prop.bPanel then SetTimer(Prop.MainHandle, SKAERO_ANIM_TIMER, 16, nil); end; end;
Delphi-Quellcode:
Es geht um den Bereich wo die Thumbnails zu sehen sind.
WM_TIMER:
begin if wP = SKAERO_ANIM_TIMER then begin if Prop.Panel <> 0 then begin GetWindowRect(Prop.Panel, rc); if (Prop.HeightOffset > 0 ) then begin MoveWindow(Prop.Panel, rc.Left, rc.Top, rc.right - rc.left, Prop.HeightOffset, true); Prop.HeightOffset := Prop.HeightOffset - 10; // sollte umgekehrt sein das Fenster soll reinfahren bis es nicht mehr sichtbar ist. end else begin ShowWindow(Prop.Panel, SW_HIDE); KillTimer(WinHandle, SKAERO_ANIM_TIMER); Prop.bPanel := False; DestroyWindow(Prop.Panel); end; end; end; gruss |
AW: Fenster ausfahren
1. Es wäre immer schön, wenn du uns zeigst, als welchen Typ deine Variablen deklariert sind, weil man so sonst immer raten muss (rc, p, Prop.MainHandle, Prop.Panel etc.).
2. Du hast deine Erwartungshaltung zwar beschreiben, aber nicht den aktuellen Ist-Zustand. Was genau will denn nicht? Was passiert? Wie sieht es zur Zeit aus? Oder um mit Textaufgaben aus der Schule zu sprechen: du hast das "Gesucht" geschrieben, aber nicht das "Gegeben". 3. Wieder mal völliges fehlen der Auswertung der Rückgabewerte der Windowsfunktionen, die alle gut in der MSDN dokumentiert sind. Stichwort: Fehlerbehandlung! Du wurdest darauf schon sehr oft hingewiesen. Auf jeden Fall sowas schreiben wie
Delphi-Quellcode:
oder
if not MoveWindow(...) then
RaiseLastOSError;
Delphi-Quellcode:
Win32Check(MoveWindow(...));
4. MoveWindow hat als letzten Parameter
Delphi-Quellcode:
. Wie ist es, wenn du hier mal TRUE schreibst?
_In_ BOOL bRepaint
|
AW: Fenster ausfahren
Zitat:
2.// sollte umgekehrt sein das Fenster soll reinfahren bis es nicht mehr sichtbar ist. (Der ist zustand liest sich heraus(Das Fenster soll in umgekehrter weise sliden) Zitat:
MainHandle das Fensterhandle der Anwendung muss überlegen glaube
Delphi-Quellcode:
Prop.PanelHeight irgendwas mit Höhe Integer.
HWND = type LongWord;
//The LongInt type is the equivalent 32 bit type for signed integers (-2147483648 to 21474783647). Ok sorry aber das war nicht die Frage. Zitat:
Habe noch nie Rückgabewerte für solche triviale Dinge definiert und ist auch nicht nötig. Zeige mir einen sinnvollen Win32Api Code in dem die Rückgabe von MoveWindow ausgewertet wird. Auch hier hat nichts mit meiner Fragestellung zu tun. Zitat:
Zitat:
![]() gruss |
AW: Fenster ausfahren
Liste der Anhänge anzeigen (Anzahl: 1)
Probiere mal kleinere Schrittweiten beim rausfahren:
Delphi-Quellcode:
MoveWindow(Prop.Panel, rc.left, rc.Top + 2, //<----
Zitat:
Keine Angst, das wird dein Code auch nur um 2 Nanosekunden langsamer machen. :shock: Zitat:
Wenn ich in einen kleinen Test das mal ausprobiere, sehe ich schon, dass ein Neuzeichnen nicht verkehrt wäre (siehe Bildanhang).
Delphi-Quellcode:
PS: rc und p sind keine guten Beispiele für sinnvolle Namensgebung.
procedure TForm5.Panel1Click(Sender: TObject);
var bRepaint: BOOL; begin bRepaint := True; //False Panel1.Caption := 'bRepaint is ' + BoolToStr(bRepaint, True); Win32Check(MoveWindow(Panel1.Handle, Panel1.Left + 10, Panel1.Top + 10, Panel1.Width + 10, Panel1.Height + 10, bRepaint)); end; |
AW: Fenster ausfahren
erst mal Danke.
Zitat:
Mein Problem ist das nicht das ganze Fenster rausgefahren wird sondern dieses nur in der Höhe verändert wird. Das hat einen faden Visuellen Beigeschmack. Ich habe aber keine Idee wie ich das sonst machen könnte. Das Fenster ist kein Parent von der Main Form deshalb muss ich es beim Start in der Höhe auf 0 setzen und diese pixelweise auf die end höhe vergrößern. Das ist mein eigentliches Dilemma. Zitat:
Dein Panel ist Parent deshalb must du bRepaint auf TRUE setzen damit der Hintergrund sich neu zeichnet beim verschieben. Ein Neuzeichnen ist nicht nötig das ist der einzige Grund. (Es sei denn ich will den Desktop aktualisieren) :) Zitat:
Zitat:
Aber warum ich es nicht mache will ich noch erläutern. MoveWindow ist ein Visuelle Funktion die man Visuell gegenprüfen kann, entweder das Window verschiebt sich oder halt nicht. Und das kann man sehen (Visuell also) Ich weis\sehe also ohne einer Rückgabe Auswertung ob die Funktion erfolgreich war oder nicht. Daher kann ich mir diese sparen. gruss |
AW: Fenster ausfahren
Ich verwende in älteren VCL Projekten die WinAPI Funktion AnimateWindow().
Für TForm z.B.
Delphi-Quellcode:
In einem alten Projekt für ein TPanel:
Form2.BringToFront;
AnimateWindow(Form2.Handle, 250, AW_BLEND); Form2.Show;
Delphi-Quellcode:
Ist nur Pseudocode aus einer einfach erstellten VCL Anwendung mit 2 TForms. Vielleicht hilf es dir.
procedure TForm1.Button1Click(Sender: TObject);
begin if Panel1.Visible then ClosePanel else OpenPanel; end; procedure TForm1.OpenPanel; begin AnimateWindow(Panel1.Handle, 250, AW_ACTIVATE or AW_VER_NEGATIVE); Panel1.Visible := True; end; procedure TForm1.ClosePanel; begin AnimateWindow(Panel1.Handle, 250, AW_ACTIVATE or AW_VER_NEGATIVE); Panel1.Visible := False; end; |
AW: Fenster ausfahren
Zitat:
Ich muss das Komplette Window scrollen nicht in der Höhe pixelweise verändern. gruss |
AW: Fenster ausfahren
Wenn ich das richtig verstehe meinst du nicht Fenster sondern einen Teil (Panel?) im Fenster.
|
AW: Fenster ausfahren
Zitat:
gruss |
AW: Fenster ausfahren
Woran kann es liegen das sich mein Fenster nicht in den Negativen "Top" Bereich verschieben lässt?
Das müsste doch eigentlich gehen. Ein 0 -y funktioniert nicht das Child Window bleibt immer bei 0 stehen. tssss... gruss |
AW: Fenster ausfahren
Zitat:
* [Win+E] Editor [Enter] -> Starte ein Notepad * Strg+Leertaste -> Fenstermenü * [V] -> Verschieben * Pfeil Hoch -> nach oben verschieben * [Enter] -> Verschieben beenden |
AW: Fenster ausfahren
Ja du hast recht.. ;)
gruss |
AW: Fenster ausfahren
Ich versuche es nochmal.
Woran kann es liegen das sich mein Fenster nicht in den Negativen "Top" Bereich verschieben lässt? Das Fenster im oberen Bereich wird Top ins minus verschoben. Funktioniert auch so weit. Aber wenn ich das Hauptfenster höher zum Screen verschiebe wird nur noch ein Teil ins Negative verschoben. Habe zwei pics angehängt. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 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 by Thomas Breitkreuz