Können Sie ein Borderless Application-Hauptfenster in Windows ohne WS_POPUP-Stil erstellen?

8

Ich möchte ein Fenster erstellen, das das Hauptfenster ist und das Windows selbst als Hauptanwendungsfenster erkennt. Wenn ich jedoch mein Fenster randlos und ohne einen Nicht-Client-Bereich mache, erkennt Windows nicht mehr, dass dieses Fenster ein Hauptfenster der Anwendung ist. Dies hat mehrere Nebenwirkungen:

  1. WindowsKey + M minimiert alle Fenster außer dem Hauptfenster meiner Anwendung.

  2. Wenn Sie einmal auf die Taskleiste klicken (in win7) und dann erneut, sollten Sie den Zustand / die Sichtbarkeit des Hauptfensters des Programms zwischen normalem und minimiertem Status umschalten. Dies funktioniert nicht für ein solches Fenster.

In einfachen Win32-Programmierbegriffen frage ich nach Parameterwerten für dwStyle wie beim Aufruf von CreateWindow (WS_ .. Konstanten) oder CreateWindowEx (WS_EX _... Konstanten). Für Delphi-Benutzer würden diese Werte in der CreateParams-Methode festgelegt, die Sie überschreiben würden, und dann Params.Style: = WS_xxx; Für MFC / C ++ - Benutzer und C-Benutzer würde schließlich etwas in Ihrem Framework CreateWindow mit diesem dwStyle-Wert aufrufen.

In Delphi-Begriffen führt das Setzen von form.BorderStyle = bsNone zu dwStyle = WS_POPUP. Ich möchte jedoch ein randloses Fenster ohne dwStyle = WS_POPUP.

Hinweis: Alle untenstehenden Antworten sind gut, aber die Verwendung in Produktionsszenarien ist problematisch, und meine Versuche, dies zu tun, haben zu vielen Störungen geführt, die ich für eine professionelle Qualitätsanwendung immer noch nicht finden kann . Davids Antwort ist eine große, reine Win32-API-Antwort und passt zur Rechnung. Es scheint, dass eine industrielle Stärke Lösung mehrere Qualitäten kombinieren sollte, einschließlich all jener, die ich in meiner Frage oben habe. Kurz gesagt, randlose Formulare mit BorderStyle = bsNone (dwStyle = WS_POPUP) blockieren alle Windows-Funktionen, die normalerweise für Hauptfenster von Anwendungen gelten, und alle unten aufgeführten Lösungen lösen einen Teil davon.

Basierend auf Davids Vorschlägen schrieb ich Folgendes, was nicht funktioniert: Ich möchte ein Fenster ohne Rahmen, das sich auf alle Arten wie ein Windows-Anwendungsfenster dem System anpasst, dh es kann durch Klicken auf das Fenster in der Taskleiste minimiert / wiederhergestellt werden und wird durch WindowsKey + M minimiert . Ich fange an zu denken, dass der einzige Weg dies zu tun ist, den Nicht-Client-Farbcode hinzuzufügen und die oberen Grenzen des Nicht-Clientbereichs auf Null zu ändern. Das ist natürlich keine triviale Idee.

Es stellt sich heraus, dass ich einen einfachen Fehler in meiner Codierung gemacht habe (daher die beiden obigen Absätze) und tatsächlich funktioniert der unten stehende Code jetzt so, wie ich es wünsche. Dies ist in Pascal, aber es sollte einfach sein, es in C ++ oder etwas anderes zu konvertieren.

%Vor%     
Warren P 04.02.2011, 19:11
quelle

3 Antworten

13

Folgendes wird erledigt:

%Vor%

Vermutlich haben Sie WS_MINIMIZEBOX vermisst.

    
David Heffernan 04.02.2011, 19:20
quelle
4

Ein bisschen eklig, aber Sie können die Fensterregion festlegen, indem Sie dies in Ihr YourForm.OnShow-Ereignis einfügen:

%Vor%     
GolezTrol 04.02.2011 19:37
quelle
-4

Sie müssen TForm.CreateParams überschreiben und einen Stil festlegen oder entfernen, an dem Sie interessiert sind

%Vor%     
APZ28 04.02.2011 21:53
quelle

Tags und Links