Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
ich bastel grad n Editor. Solange man im Editor ist is das ganze Prog im fesnter, aber bei der Vorschau soll es auf Vollbild gehen. Dazu setzt ich den VorderStyle der MainForm auf bsNone und verschiebe sie dann noch richtig. Aber danach hab ich nur noch n weißes Bild, und nich mehr die eigentliche Szene. Ich hab außer dem BorderStyle und den Fensterkoordinaten nix geändert und hab trotzdem kein Bild mehr?! Weiß jmd woran das liegt?
so hab ich das gemacht:
Code:
BorderStyle := bsNone;//Bordersytle setzten
SaveVars.Left:= Left;//Fesnterkoordinaten für später speichern
Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Also das Fenster zu maximieren geht eigentlich ganz einfach mit WindowState := wsMaximized;
Code:
procedure TForm1.Button1Click(Sender:TObject);
begin
borderstyle := bsNone;
windowstate := wsMaximized;
end;
procedure TForm1.Button2Click(Sender:TObject);
begin
borderstyle := bsSizeable;
windowstate := wsNormal;
end;
Warum du allerdings danach ein weißes Fenster hast weiß ich auch nicht... mir ist beim testen nur aufgefallen (hatte ein Panel), dass dieses nach dem Maximieren von OpenGL überzeichnet wird. Keine Ahnung warum ^^
//edit grade nochmal getestet. Jetzt hatte ich den Renderkontext in einem Panel, und die Buttons in einem anderen, und damit funktionierte es bei mir gut. Also vielleicht löst dass dein Problem, wenn den Renderkontext in einem Panel erzeugst und ebentuelle Bedienelemente in einem anderen.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
Das mit dem Borderstyle auf bsNone setzen verträgt sich nicht so gut mit OpenGL. Keine Ahnung wie das genau gehandhabt wird, aber auf alle Fälle ändert sich das Handle der Form. Das kann man auch leicht testen.
Da ja OpenGL das Handle braucht, ist es nicht so gut wenn das Fenster dazu nicht mehr existiert.
Keine Ahnung ob man irgendwie OpenGL verklickern kann, dass sich das Handle geändert hat. Ich hatte das Problem auch schon und hab' da keine Lösung gefunden die zufriedenstellend war.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das Problem ist, dass Borderstyle von Delphi das Fenster zerstört und neu erstellt. Entsprechend ist der DC/RC futsch. Das Delphi das so macht ist ein bisschen sinnfrei, da BorderStyle normal nur ein Style des Fensters ist. Und den kann man nachträglich auch einfach setzen. In Delphi 2007 funktioniert BorderStyle scheinbar wie es sein soll. Weiß gerade aber nicht was die Turbos dazu sagen.
Zum Entfernen von bsSizeable
Code:
var
Style:Cardinal;
begin
Style := GetWindowLong(Handle, GWL_STYLE);
Style := Style andnot(WS_BORDER or WS_THICKFRAME or WS_DLGFRAME);
SetWindowLong(Handle, GWL_STYLE, Style);
SetWindowPos(Handle,0,0,0,0,0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE);
end;
Zum Setzen von bsSizeable
Code:
var
Style:Cardinal;
begin
Style := GetWindowLong(Handle, GWL_STYLE);
Style := Style or WS_BORDER or WS_THICKFRAME or WS_DLGFRAME;
SetWindowLong(Handle, GWL_STYLE, Style);
SetWindowPos(Handle,0,0,0,0,0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE);
end;
GetWindowLong und SetWindowLong sind zum Lesen und Setzen der WindowStyles. SetWindowPos sorgt dafür, dass das Fensters mit bekommt, dass sich an seinen Styles etwas geändert hat. Wenn der BorderStyle bsDialog ist, dann darf WS_THICKFRAME nicht gesetzt werden. Denn das sorgt dafür, dass das Fenster Größenveränderbar ist.
Achja. Diese Methoden arbeiten direkt mit der API und gehen an der VCL vorbei. Entsprechend ändert sich der Wert von BorderStyle durch diesen Code natürlich nicht. BorderStyle darf also nicht zur Auswertung von irgendwelchen Statis benutzt werden.
[Edit] Hui. Ich sehe gerade, dass die eigentlich Frage sogar schon recht alt ist.
Hab aber noch eine Anmerkung. Das einzelne Setzen von Top, Left, Width und Height ist etwas unpraktisch, da bei jedem Befehl das Fenster ein mal Angepasst und Gezeichnet werden muss. Du kannst bei Controls auch die Eigenschaft BoundsRect benutzen. Das ist ein TRect. Kannst du aber nur im Ganzen setzen. Also "BoundsRect := Rect(0, 0, Screen.Width, Screen.Height)". Dann wird dein Fenster auch nur ein einziges Mal verschoben und gezeichnet.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.