Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rand eines Windows nicht anzeigen (https://www.delphipraxis.net/61914-rand-eines-windows-nicht-anzeigen.html)

3_of_8 27. Jan 2006 20:47


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?

Cyberbob 27. Jan 2006 20:55

Re: Rand eines Windows nicht anzeigen
 
Mach doch einfach BorderStyle := bsNone und zeichne die Titelleiste neu.

3_of_8 27. Jan 2006 20:57

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.)

Rastaman 27. Jan 2006 21:04

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.

3_of_8 27. Jan 2006 21:06

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?

Rastaman 27. Jan 2006 21:06

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 ^^

3_of_8 27. Jan 2006 21:09

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.

Rastaman 27. Jan 2006 21:10

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.

3_of_8 27. Jan 2006 21:13

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...

Rastaman 27. Jan 2006 21:13

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.

3_of_8 27. Jan 2006 21:17

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);

Luckie 27. Jan 2006 21:20

Re: Rand eines Windows nicht anzeigen
 
Zitat:

WS_OVERLAPPED
Creates an overlapped window. An overlapped window has a title bar and a border. Same as the WS_TILED style.

WS_OVERLAPPEDWINDOW
Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles. Same as the WS_TILEDWINDOW style.
Ergo die nötigen Stile einzeln setzen und WS_BORDERR weglassen. BTW fällt auf dass WS_OVERLAPPEDWINDOW den Stil WS_THICKFRAME beinhaltet. ;)

3_of_8 27. Jan 2006 21:21

Re: Rand eines Windows nicht anzeigen
 
Jetzt bitte nochmal die Version für dumme Normalsterbliche wie mich. ;)

Rastaman 27. Jan 2006 21:26

Re: Rand eines Windows nicht anzeigen
 
Delphi-Quellcode:
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;
Naja, eigentlich Quatsch dafür 2 Variablen zu nehmen, aber naja :mrgreen:

3_of_8 27. Jan 2006 21:27

Re: Rand eines Windows nicht anzeigen
 
Und wie geht das ganze jetzt auch nach dem Erstellen des Fensters? So wie bei der VCL?

Rastaman 27. Jan 2006 21:29

Re: Rand eines Windows nicht anzeigen
 
Ja, hab ich doch geschrieben ;)
Für hWnd einfach das Handle von deinem Fenster einsetzen.

3_of_8 27. Jan 2006 21:40

Re: Rand eines Windows nicht anzeigen
 
Jo, geht. Hab das irgendwie falsch verstanden. ^^ Ich und WinAPI.

TKC 28. Jan 2006 02:10

Re: Rand eines Windows nicht anzeigen
 
Zitat:

Zitat von 3_of_8
Jo, geht. Hab das irgendwie falsch verstanden. ^^ Ich und WinAPI.

kleiner Tip ... dann lasse es sein !! :mrgreen:

3_of_8 28. Jan 2006 09:59

Re: Rand eines Windows nicht anzeigen
 
Ich brauche das nur für OpenGL. Da ist die Initialisierung mit WinAPI noch das kleinste Problem. ;)

informix05 31. Jan 2007 12:59

Re: Rand eines Windows nicht anzeigen
 
Zitat:

Zitat von 3_of_8
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?

Hallo,

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;

3_of_8 2. Feb 2007 22:08

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.

informix05 4. Feb 2007 12:52

Re: Rand eines Windows nicht anzeigen
 
Zitat:

Zitat von 3_of_8
1. war nach nonVCL gefragt, daher ist borderstyle:=bsNone; nicht möglich.
2. ich wollte das Ding nicht skalieren können.

Sorry, hab ich wohl auch falsch verstanden.

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?

informix05 4. Feb 2007 13:12

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