Entwickler-Ecke
Windows API - Vollbild unter Windows 7
Manfred - Mi 01.04.15 00:43
Titel: Vollbild unter Windows 7
Das Problem ist sicher alt, aber aus meiner Sicht nicht gelöst.
Kennt jemand einen Dreh, wie man eine Vollbild-Ansicht unter Windows 7 realisiert, wobei auch die Taskleiste überdeckt wird?
Dass es gehen muss, beweist der IE, aber eigene Anwendungen scheitern daran offenbar.
Delete - Mi 01.04.15 02:05
Rechtsklick auf Taskleiste, Eigenschaften, Taskleiste automatisch ausblenden.
baumina - Mi 01.04.15 08:00
Mein IE überdeckt bei maximiertem Fenster keine Taskleiste, oder wie schaltest du den IE auf Vollbild?
Hoermi93 - Mi 01.04.15 09:06
Die Vollbildansicht im IE wird durch den Druck der F11 Taste aktiviert
baumina - Mi 01.04.15 09:28
Aha, man lernt nie aus, dann würde ich folgendes vorschlagen:
Delphi-Quelltext
1: 2:
| Borderstyle := bsNone; WindowState := wsMaximized; |
jaenicke - Mi 01.04.15 09:52
Richtig, wobei der Rand hier das Entscheidende ist. Ist der Rand im maximierten Zustand aktiviert, ist auch die Taskleiste da, ist er deaktiviert, wird diese auch verdeckt.
Auf diese Weise hat Microsoft Vollbildanwendungen auf eine einfache Weise möglich gemacht ohne das normale Maximieren zu stören.
Manfred - Mi 01.04.15 14:09
Leider funktioniert das nur, wenn die Werte bereits zur Entwurfszeit definiert werden. Ich will dem Anwender aber die Möglichkeit geben zur Laufzeit auf Vollbild umzustellen. Und in dem Fall bleibt die Taskleiste sichtbar.
Die Anwendung wird zwar maximiert, schiebt sich aber hinter die Taskleiste.
baumina - Mi 01.04.15 14:27
Also ich hatte in meinem DelphiXE-Testprogramm die beiden Zeilen in einem OnClick eines Buttons drin und es hat funktioniert. Kannst du ein kleines Testprogramm machen bei dem der Aufruf zur Laufzeit nicht funktioniert?
Delete - Mi 01.04.15 15:34
Kann ich bestätigen: ich hab mal eben schnell eine private Bool-Variable deklariert und einen neuen Button hinzugefügt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TFormScanner.ButtonMaxClick(Sender: TObject); begin If Vollbild Then Begin Vollbild := False; Self.WindowState := wsNormal; Self.BorderStyle := bsSizeable; End Else Begin Self.BorderStyle := bsNone; Self.WindowState := wsMaximized; Vollbild := True; End; end; |
Das Ergebnis ist genau das erwartete: Das Formular schaltet in den Vollbild-Modus und überdeckt alles.
jaenicke - Mi 01.04.15 16:23
Das funktioniert nur, wenn man zuerst den BorderStyle setzt und danach maximiert. Andersherum geht es nicht.
Martok - Do 02.04.15 19:05
jaenicke hat folgendes geschrieben : |
Andersherum geht es nicht. |
Was übrigens ein VCL-Bug ist, da wird IIRC irgendwo beim RecreateWindow für den Borderstyle der WindowState falsch zurückgesetzt. Hat das eigentlich mal irgendwer reported? Ich hatte das vor ein paar Jahren mal erforscht, aber dann ignoriert weil man's ja auch einfach andersrum machen kann.
Manfred - Do 09.04.15 23:09
Sorry, das ich mich jetzt erst melde.
Erst einmal recht herzlichen Dank für die Antworten.
Die Beeinflussung von borderStyle führt sofort dazu, dass die Anzeige im Fenster leer ist. Ursache ist vermutlich der TWebBrowser, der in dem Formular eingebettet ist.
Meine vorläufige Lösung sieht daher so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| var l : longint; i : interger; Begin l := GetWindowLong(Handle,GWL_STYLE); if (WS_CAPTION and l)>0 then begin if WindowState <> wsmaximized then begin WindowState := wsmaximized ; end else begin l := l and not WS_CAPTION ; l := l and not WS_BORDER ; SetWindowLong(Handle,GWL_STYLE, l); ClientHeight := Height+GetSystemMetrics(SM_CYCAPTION); WindowState := wsMaximized; end; end else begin SetWindowLong(Handle,GWL_STYLE, l or WS_CAPTION or WS_BORDER);
i:=Width-ClientWidth; ClientWidth := Screen.Width-i; i:=Height-ClientHeight; ClientHeight := Screen.Height-i; WindowState := wsMaximized; end; |
Soweit ich das nachvollziehen kann, kommt das Eurer Lösung etwa gleich. Allerdings bleibt bei Vollbild-Einstellung der Border trotz "and not WS_BORDER" bestehen.
Bei Einzelmonitoren kein Problem, da er außerhalb der Monitorbreite liegt. Bei zwei Monitoren ist er sichtbar.
Zum Problem der Taskleiste unter Win 7:
Wird Vollbild aktiviert, bleibt die Taskleiste zunächst sichtbar, bis das Fenster aktiviert wird (wobei es eigentlich aktiv war), z.B. durch Anklicken. Dann verschwindet meistens die Taskleiste, oftmals aber eben nicht.
Edit: Remarks hinzugefügt
Delete - Fr 10.04.15 00:54
Im Anhang ist ein Testprogramm.
Wenn es nicht funktioniert, ist die Einstellung der Taskleiste falsch.
jaenicke - Fr 10.04.15 06:37
Manfred hat folgendes geschrieben : |
Die Beeinflussung von borderStyle führt sofort dazu, dass die Anzeige im Fenster leer ist. Ursache ist vermutlich der TWebBrowser, der in dem Formular eingebettet ist. |
Hast du vielleicht ein Testprojekt dafür, das du anhängen kannst? Ich kann das mit Delphi XE7 nicht reproduzieren. Welche Delphiversion nutzt du denn?
Manfred - Fr 10.04.15 09:44
Ich verwende für dieses Projekt Delphi 6, das Problem existiert aber auch unter XE
Die Sache mit dem Testprogramm ist etwas schwierig, da das Ding mehrere tausend Zeilen enthält. Ich werd am WE mal was zusammenbauen.
Manfred - Fr 10.04.15 09:51
@hathor
Anbei ein Screenshot-Ausschnitt Deines Testprogramms: Die Taskleiste ist sichtbar, das Modul liegt aber auch nicht hinter der Taskleiste.
Delete - Fr 10.04.15 10:47
Das Wort "Testbild" sollte in der Mitte stehen! Desktop erweitert?
Ich habe das Testprogramm etwas erweitert.
Bei mir ist die Taskleiste vorhanden, aber nicht sichtbar.
Delete - Fr 10.04.15 11:32
Nächste Erweiterung: Show Taskbar und Hide Taskbar hinzugefügt.
Man sollte das Programm aber nach Show Taskbar verlassen, sonst bleibt sie unsichtbar.
Manfred - Di 14.04.15 15:55
@hathor
Das ist ja alles ganz nett aber kein Vollbild. Die Taskleiste blendet sich zwar aus, doch das ändert nichts an der Fenstergröße der Anwendung. Der Start-Button bleibt ebenfalls sichtbar.
hathor hat folgendes geschrieben : |
Das Wort "Testbild" sollte in der Mitte stehen! Desktop erweitert? |
Das Wort "Testbild" steht auch in der Mitte, mein geposteter Screenshot von Freitag war nur ein Ausschnitt.
hathor hat folgendes geschrieben : |
Wenn es nicht funktioniert, ist die Einstellung der Taskleiste falsch. |
Welche Einstellung? Ich glaube nicht, dass es sich um ein Einstellungsproblem handelt, dann würden andere Programme (IE) ja auch nicht laufen.
Leider bin ich am WE nicht dazu gekommen, etwas zum Testen zusammenzustellen, ich bitte um Geduld, da ich z.Z. bis über beide Ohren in Arbeit stecke.
Manfred - Di 14.04.15 16:05
Hier meine Screenshots von Deinem Programm FullScreen-3
jaenicke - Di 14.04.15 18:47
Mit den Testprogrammen sieht es bei mir genauso aus. Dis Taskleiste ist sichtbar, wenn ich auf Vollbild gehe. Sowohl auf einem frisch installierten Windows 7 als auch 8.1.
Im Anhang mal ein Testprogramm, das bei mir überall funktioniert.
Martok - Di 14.04.15 19:04
jaenicke hat folgendes geschrieben : |
Mit den Testprogrammen sieht es bei mir genauso aus. Dis Taskleiste ist sichtbar, wenn ich auf Vollbild gehe. Sowohl auf einem frisch installierten Windows 7 als auch 8.1.
Im Anhang mal ein Testprogramm, das bei mir überall funktioniert. |
Jupp, kann ich bestätigen. Funktioniert mit dem Code von
Perlsau in Delphi 7, 2007 und Lazarus auf Win 8.1.
Edit: Du wolltest uns jetzt testen, oder
hathor? Dein Formular hat (jedenfalls in der Resource) Align=alClient statt WindowState=wsMaximized. Ganz was anderes.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!