Können Sie eine Grenzenlose Anwendung Hauptfenster in Windows, ohne WS_POPUP Stil?
Ich möchte ein Fenster erstellen, wird im Hauptfenster und das Windows selbst erkennt als das Hauptfenster der Anwendung. Jedoch, wenn ich meine Fenster ohne Rand und ohne nicht-client-Bereich von Windows nicht mehr erkennt, dass dieses Fenster ist eine Anwendung Hauptfenster. Dies hat mehrere Auswirkungen:
-
WindowsKey+M minimiert alle Fenster außer meine Anwendung Hauptfenster.
-
Einmal klicken auf der Taskleiste (win7) und dann wieder, sollte Umschalten der Anwendung Haupt-Fenster Status/Sichtbarkeit zwischen normal-und minimierten Zustand. Das funktioniert aber nicht so ein Fenster.
In der bloßen Win32-Programmierung angeht, ich bin zu Fragen, über die parameter-Werte für dwStyle wie beim Aufruf CreateWindow (WS_... - Konstanten), oder CreateWindowEx (WS_EX_... - Konstanten). Für delphi-Anwender, diese Werte würden in der CreateParams-Methode, die Sie überschreiben, und legen Sie dann Params.Stil := WS_xxx; Für MFC/C++ und C Benutzer, etwas in Ihrem Rahmen schließlich dem Aufruf CreateWindow, mit diesem dwStyle Wert.
In delphi Bedingungen, Einstellung Ihrer form.BorderStyle=bsNone, Ergebnisse im dwStyle=WS_POPUP. Aber ich will ein randloses Fenster ohne Verwendung dwStyle=WS_POPUP.
Hinweis: Alle Antworten sind gut, aber mit jedem in der Produktion-Szenarien ist problematisch, und meine versuche dazu geführt haben, in der Begegnung mit vielen glitches, die für eine professionelle Anwendung, die ich noch finden kann ich nicht umgehen. Davids Antwort ist ein großartiger Reine Win32-API-Antwort aber, und das passt die Rechnung. Es scheint, dass eine industrielle Stärke-Lösung kombinieren mehrere Eigenschaften, einschließlich alle, die ich in meiner Frage oben. In kurzen, randlosen Formen mit BorderStyle=bsNone (dwStyle=WS_POPUP) blockieren Sie alle Windows-Funktionen gilt in der Regel für Haupt-windows-Anwendungen, und alle Lösungen unter Lösung Teil davon.
Basierend auf David ' s Vorschläge, ich schrieb das folgende, was nicht funktioniert:
Ich möchte ein Fenster ohne Rahmen, das verhält sich in allen Möglichkeiten, wie Sie eine windows-Anwendung Fenster, um das system, das heißt, es kann sein, minimiert/wiederhergestellt, indem Sie auf das Fenster in der Taskleiste minimiert werden, indem Sie WindowsKey+M. ich bin Anfang zu denken, dass der einzige Weg, dies zu tun ist das hinzufügen von nicht-client-paint-code und ändern Sie die Größe der Spitze nicht-Clientbereich Grenzen zu null. Dies ist natürlich nicht eine triviale Idee.
Es stellt sich heraus, dass ich einen einfachen Fehler in meiner Codierung (daher die beiden Absätze oben) und in der Tat der code unten funktioniert jetzt wie ich es möchte. Dieses ist in pascal, aber es sollte einfach sein, es zu konvertieren, um C++ oder sonst was.
program NoBorderProject;
uses
Windows, Messages;
{the Messages unit contains the windows
Message constants like WM_COMMAND}
{$R *.RES}
var
wClass: TWndClass;
Msg: TMsg;
win:HWND;
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;
begin
if Msg = WM_DESTROY then PostQuitMessage(0);
Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;
begin
wClass.lpszClassName:= 'CN';
wClass.lpfnWndProc := @WindowProc;
wClass.hInstance := hInstance;
wClass.hbrBackground:= 1;
RegisterClass(wClass);
win := CreateWindow(wClass.lpszClassName,'Title Bar',
WS_POPUP,//WS_OVERLAPPEDWINDOW or WS_VISIBLE,
10,10,340,220,0,0,hInstance,nil);
SetWindowLong(win, GWL_STYLE, WS_POPUP or WS_MINIMIZEBOX);
SetWindowLong(win, GWL_EXSTYLE, 0 );
ShowWindow(win,SW_SHOW);
while GetMessage(Msg,0,0,0) do
DispatchMessage(Msg);
end.
- Ich fand Ihre Fehler. Sie setzen
GWL_STYLE
zweimal. Der zweite AufrufSetWindowLong
sollte festgelegtGWL_EXSTYLE
. - Hier mit D7, MainForm.BorderStyle = bsNone trotzdem nicht verhindern, dass WinKey+M aus arbeiten. Auch minimieren/wiederherstellen schaltet einwandfrei. Könnte dies zurückgeführt werden auf die Eigenschaft MainFormOnTaskbar von TApplication, die standardmäßig festgelegt ist, in neueren Delphi-Versionen?
- NGLN - Genau. Delphi 7 hat eine falsche top-level application window und so in Windows nicht denken, dass Ihre form ist Ihre Anwendung Hauptfenster, verwendet es die alten Delphi-hack eines verborgenen Spezial-Hauptfenster. Dieses Verhalten ist auch die Wurzel der Z-Reihenfolge Fehler, die in der Delphi-7-ära Hauptformular hack.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgenden wird die Arbeit getan:
Waren Sie wahrscheinlich fehlt
WS_MINIMIZEBOX
.WS_POPUP
Stil, wenn Sie wollen nicht zu haben, eine Grenze. Aber vielleicht können Sie das Fenster Verhalten sich normalerweise auch wenn dieWS_POPUP
etwas gibt es?BorderStyle := bsSizeable
),WS_EX_APPWINDOW
eingestellt ist. Es wird auch gesetzt, wenn Sie ändernBorderStyle
zubsNone
. Aber wenn SieMainFormOnTaskbar
auf false gesetzt, dannWS_EX_APPWINDOW
wird nicht eingestellt werden. Daher, "[meine] Antwort ergibt sich inWS_EX_APPWINDOW
als ausgeschlossen".WS_POPUP
um loszuwerden, die Fensterrahmen, zumindest in einem VCL -CreateParams
Einstellung.)CreateParams
- code, um zu bekommen eine bessere Antwort, und mehr upvotes! Stil sollteWS_POPUP or WS_MINIMIZEBOX
.CreateParams
. Aber ich denke wirklich, dass dies besser ist, einfache Win32-API-code anstatt VCL, für den Zweck des Verstehens. Sie wollen nicht, dass die VCL-Einstellung, die Dinge hinter Ihrem Rücken.Ein bisschen eklig, aber Sie können die Fenster-region, indem Sie diesen in YourForm.OnShow-Ereignis:
Müssen Sie zum überschreiben von TForm.CreateParams und setzen oder entfernen Sie jede Formatvorlage, die Sie interessiert sind,