![]() |
Rand eines Windows nicht anzeigen
Ich habe ein Fenster erstellt.
Davon will ich jetzt den Rand verstecken, so wie bei TForm.borderstyle:=bsNone; Aber ich finde die passenden Messages nicht. Wie mache ich das? |
Re: Rand eines Windows nicht anzeigen
Mach doch einfach BorderStyle := bsNone und zeichne die Titelleiste neu.
|
Re: Rand eines Windows nicht anzeigen
Prima Idee. Aber sei mal so nett und guck auf die Kategorie: WinAPI!!!
Da gibts keinen BorderStyle! Da muss ich Postmessage(h_wnd,WM_IRGENDWAS,0,0); machen. (Bitte meinen Sarkasmus nicht zu ernst nehmen.) |
Re: Rand eines Windows nicht anzeigen
Zeig doch mal den Code mit dem du das Fenster erstellt hast.
Im Zweifelsfall vielleicht mal WS_SYSMENU oder WS_DLGFRAME etc. raus nehmen. |
Re: Rand eines Windows nicht anzeigen
Ich glaube ihr versteht mich alle nicht.
Ich habe ein Fenster MIT Rand. Ich will daraus ein Fenster OHNE Rand machen. Welche Message brauche ich dazu? |
Re: Rand eines Windows nicht anzeigen
Gar keine. Einfach den Style schon beim erstellen des Fensters so setzen, dasses keinen Rand hat.
Gib doch mal den Code der das Fenster erstellt, das macht alles um eineiges einfacher. //Edit: AHA. Verstanden ^^ Zeig trotzdem mal den Code. --> Kurze Denkpause ^^ |
Re: Rand eines Windows nicht anzeigen
Der ist a) nicht von mir und b) sehr groß.
Bitte, sag mir einfach eine Zeile Code. PostMessage(h_wnd,WM_SYSCOMMAND,SC_BORDERSTYLE,0); So in etwa stelle ich mir das vor. Aber SC_BORDERSTYLE kennt er halt nicht. |
Re: Rand eines Windows nicht anzeigen
Also damit ich es dir genau sagen kann, musst du mir schon den CreateWindow(Ex) Befehl geben, der des Fensters das du verändern möchtest. Mehr brauch man ja nicht.
|
Re: Rand eines Windows nicht anzeigen
Gibt es keine Möglichkeit, das erst nach der Erstellung des Windows zu ändern? Bei der VCL gehts doch auch...
|
Re: Rand eines Windows nicht anzeigen
Doch, das möcht ich dir auch sagen, aber dazu brauche ich die genauen Parameter die du bei CreateWindow(Ex) angibst.
|
Re: Rand eines Windows nicht anzeigen
Delphi-Quellcode:
with wndClass do // Setup der Fenster Klasse
begin style := CS_HREDRAW or // Neuzeichenen wenn Fenster-Breite geändert CS_VREDRAW or // Neuzeichenen wenn Fenster-Höhe geändert CS_OWNDC; // Device Context exlusiv lpfnWndProc := @WndProc; // WndProc wird als Window Procedure gesetzt hInstance := h_Instance; hCursor := LoadCursor(0, IDC_ARROW); lpszClassName := 'OpenGL'; end; if (RegisterClass(wndClass) = 0) then // Fenster Klasse registrieren begin MessageBox(0, 'Failed to register the window class!', 'Error', MB_OK or MB_ICONERROR); Result := False; Exit end; dwStyle := WS_OVERLAPPEDWINDOW or // Überschneidung zulassen WS_CLIPCHILDREN or // Kein Zeichnen in Child Fenstern WS_CLIPSIBLINGS; // Kein Zeichnen in Sibling Fenstern dwExStyle := WS_EX_APPWINDOW or // Fenster im Fordergrund WS_EX_WINDOWEDGE; // Erhobener Rand // Das oben definierte Fenster wird erstellt h_Wnd := CreateWindowEx(dwExStyle, // Erweiterter Fenster Stil 'OpenGL', // Name der Klasse PChar(WindowTitle), // Fenster Titel (caption) dwStyle, // Fenster Stil 0, 0, // Fenster Position Width, Height, // Größe des Fensters 0, // Keine Paren-Windows 0, // Kein Menü h_Instance, // die Instanz nil); |
Re: Rand eines Windows nicht anzeigen
Zitat:
|
Re: Rand eines Windows nicht anzeigen
Jetzt bitte nochmal die Version für dumme Normalsterbliche wie mich. ;)
|
Re: Rand eines Windows nicht anzeigen
Delphi-Quellcode:
Naja, eigentlich Quatsch dafür 2 Variablen zu nehmen, aber naja :mrgreen:
var
dwExStyle, dwStyle: Cardinal; begin dwExStyle := GetWindowLong(hWnd, GWL_EXSTYLE); SetWindowLong(hWnd, GWL_EXSTYLE, dwExStyle and not WS_EX_APPWINDOW); dwStyle := GetWindowLong(hWnd, GWL_STYLE); SetWindowLong(hWnd, GWL_STYLE, dwStyle and not WS_OVERLAPPEDWINDOW); end; |
Re: Rand eines Windows nicht anzeigen
Und wie geht das ganze jetzt auch nach dem Erstellen des Fensters? So wie bei der VCL?
|
Re: Rand eines Windows nicht anzeigen
Ja, hab ich doch geschrieben ;)
Für hWnd einfach das Handle von deinem Fenster einsetzen. |
Re: Rand eines Windows nicht anzeigen
Jo, geht. Hab das irgendwie falsch verstanden. ^^ Ich und WinAPI.
|
Re: Rand eines Windows nicht anzeigen
Zitat:
|
Re: Rand eines Windows nicht anzeigen
Ich brauche das nur für OpenGL. Da ist die Initialisierung mit WinAPI noch das kleinste Problem. ;)
|
Re: Rand eines Windows nicht anzeigen
Zitat:
du möchtest wahrscheinlich ein rand- und titelleistenloses Fenster haben, dass aber trotzdem verschieb- und skalierbar bleibt. - Im uses-Teil muss die Unit "Messages" enthalten sein. - Die Eigenschaft "BorderStyle" deines Fenster muss auf "bsNone" gesetzt werden (auch zur Laufzeit möglich). - Im Deklarationsteil deiner TForm-Klasse im private-Abschnitt ist folgende Prozedur einzufügen, die Windows-Mausbotschaften ans Fenster abfängt: procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; - Im Implementations-Teil fügst du folgenden Quelltext ein:
Delphi-Quellcode:
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
const BORDER_WIDTH = 5; begin inherited; if M.Result = htClient then begin // Mauszeiger im Client-Bereich des Fensters // Windows vorgaukeln, Mauszeiger wäre auf Titelleiste des Fensters // ==> Fenster ohne Titelleiste kann durch Klick & Drag im Client-Bereich verschoben werden M.Result := htCaption; // falls Mauszeiger am nicht vorhandenen Fensterrand // ==> Windows vorgaukeln, Rand wäre vorhanden // ==> Fenster (BorderStyle = bsNone) kann trotzdem skaliert werden if (M.XPos > Left) and (M.XPos < Left + BORDER_WIDTH) then begin // Mauszeiger am linken Rand M.Result := htLeft; if (M.YPos > Top) and (M.YPos < Top + BORDER_WIDTH) then begin // Mauszeiger an Ecke oben links M.Result := htTopLeft; end else begin if (M.YPos < Top + Height) and (M.YPos > Top + Height - BORDER_WIDTH) then begin // Mauszeiger an Ecke unten links M.Result := htBottomLeft; end end; end else begin if (M.XPos < Left + Width) and (M.XPos > Left + Width - BORDER_WIDTH) then begin // Mauszeiger am rechten Rand M.Result := htRight; if (M.YPos > Top) and (M.YPos < Top + BORDER_WIDTH) then begin // Mauszeiger an Ecke oben rechts M.Result := htTopRight; end else begin if (M.YPos < Top + Height) and (M.YPos > Top + Height - BORDER_WIDTH) then begin // Mauszeiger an Ecke unten rechts M.Result := htBottomRight; end end; end else begin // Mauszeiger innerhalb linker u. rechter Rand if (M.YPos > Top) and (M.YPos < Top + BORDER_WIDTH) then begin // Mauszeiger am oberen Rand M.Result := htTop; end else begin if (M.YPos < Top + Height) and (M.YPos > Top + Height - BORDER_WIDTH) then begin // Mauszeiger am unteren Rand M.Result := htBottom; end end; end; end; end; end; |
Re: Rand eines Windows nicht anzeigen
1. war nach nonVCL gefragt, daher ist borderstyle:=bsNone; nicht möglich.
2. ich wollte das Ding nicht skalieren können. |
Re: Rand eines Windows nicht anzeigen
Zitat:
Aber jetzt habe ich eine ähnliches Problem: ich habe ein anderes Programm (nicht mit Delhpi und nicht von mir erstellt), das ein Fenster ohne Titelleiste u. Rand hat. Diesem Fenster möchte ich nun mit einem Delphi-Programm Titelleiste u. Rand hinzufügen. Mit SetWindowLong(...) etc. bekomme ich das nicht hin. Hast du mittlerweile eine Lösung für dein Problem? |
Re: Rand eines Windows nicht anzeigen
Heureka, Rand verstecken bzw. anzeigen mit SetWindowLong(...) funktiniert schon, man muss danach aber noch über SetWindowPos(...) eine SWP_FRAMECHANGED Message senden, damit Windows den geänderten Rand auch neu zeichnet:
Delphi-Quellcode:
//*** Titelleiste u. Rand eines Fenster verstecken ***
procedure TForm1.Button_HideBorderClick(Sender: TObject); var dwStyle : Cardinal; hWnd : THandle; begin hWnd := FindWindow(nil, 'PowerPoint-Bildschirmpräsentation - [gruenes_licht.pptm]'); dwStyle := GetWindowLong(hWnd, GWL_STYLE); SetWindowLong(hWnd, GWL_STYLE, dwStyle and not WS_OVERLAPPEDWINDOW); SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOREPOSITION or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED); end; //*** Titelleiste u. Rand eines Fenster anzeigen *** procedure TForm1.Button_ShowBorderClick(Sender: TObject); var dwStyle : Cardinal; hWnd : THandle; begin hWnd := FindWindow(nil, 'PowerPoint-Bildschirmpräsentation - [gruenes_licht.pptm]'); dwStyle := GetWindowLong(hWnd, GWL_STYLE); SetWindowLong(hWnd, GWL_STYLE, dwStyle or WS_OVERLAPPEDWINDOW); SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOREPOSITION or SWP_NOSIZE or SWP_NOZORDER or SWP_DRAWFRAME or SWP_FRAMECHANGED); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz