Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 02:10

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Aug 07, 2009 11:33 
Offline
DGL Member
Benutzeravatar

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:
  1.   BorderStyle := bsNone; //Bordersytle setzten
  2.   SaveVars.Left   := Left; //Fesnterkoordinaten für später speichern
  3.   SaveVars.Top    := Top;
  4.   SaveVars.Width  := Width;
  5.   SaveVars.Height := Height;
  6.   SaveVars.active := true;
  7.   GroupBox1.Visible := False; //Bedienelemente ausblenden
  8.  
  9.   Left := 0; //Fensterkoordinaten anpassen
  10.   Top  := 0;
  11.   ClientWidth  := Screen.Width;
  12.   ClientHeight := Screen.Height;
  13.  


MfG & Thx Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 21, 2009 16:41 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2. procedure TForm1.Button1Click(Sender: TObject);
  3. begin
  4.   borderstyle := bsNone;
  5.   windowstate := wsMaximized;
  6. end;
  7.  
  8. procedure TForm1.Button2Click(Sender: TObject);
  9. begin
  10.   borderstyle := bsSizeable;
  11.   windowstate := wsNormal;
  12. end;
  13.  


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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 23, 2009 18:26 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 24, 2009 01:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
OK, danke für die Antworten, dann muss ich jetzt bisl umplanen...

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 24, 2009 09:08 
Offline
DGL Member
Benutzeravatar

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:
  1. var
  2.   Style: Cardinal;
  3. begin
  4.   Style := GetWindowLong(Handle, GWL_STYLE);
  5.   Style := Style and not (WS_BORDER or WS_THICKFRAME or WS_DLGFRAME);
  6.   SetWindowLong(Handle, GWL_STYLE, Style);
  7.   SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE);
  8. end;


Zum Setzen von bsSizeable
Code:
  1. var
  2.   Style: Cardinal;
  3. begin
  4.   Style := GetWindowLong(Handle, GWL_STYLE);
  5.   Style := Style or WS_BORDER or WS_THICKFRAME or WS_DLGFRAME;
  6.   SetWindowLong(Handle, GWL_STYLE, Style);
  7.   SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE);
  8. 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. :oops:

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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]