Delphi-PRAXiS
Seite 2 von 3     12 3      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.
Seite 2 von 3     12 3      

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