Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fenster Größe ändern ohne Border (https://www.delphipraxis.net/46794-fenster-groesse-aendern-ohne-border.html)

freak24 31. Mai 2005 18:15


Fenster Größe ändern ohne Border
 
Ist es irgendwie möglich, dass der Anwender die Größe eines Fensters ändern kann, wenn Border auf "None" steht? Oder kann man Titelzeile und den dicken Rahmen bei Border = Sizeable ausblenden?

sniper_w 31. Mai 2005 18:22

Re: Fenster Größe ändern ohne Border
 
Ja, es ist möglich, allerdings nicht so einfach. Vielleicht solltetst su etwas über WM_NCxxx-Messages lesen, da kannst du Non-Client Bereich verwalten.

SirThornberry 31. Mai 2005 18:27

Re: Fenster Größe ändern ohne Border
 
eigentlich ganz einfach wenn man weiß wie:
Delphi-Quellcode:
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
[...]
procedure TSBMainForm.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  DefaultHandler(Msg);
  with Msg do
        // TOP
    if PtInRect(Rect(0, 0, Width, 4), Point((XPos - Left), (YPos - Top))) then
      RESULT := htTop
        // LEFT
    else if PtInRect(Rect(0, 0, 4, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htLeft
        // BOTTOM
    else if PtInRect(Rect(0, Height - 4, Width, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htBottom
        // RIGHT
    else if PtInRect(Rect((Width - 4), 0, Width, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htRight
        // TOPLEFT
    else if PtInRect(Rect(0, 0, 4, 4), Point((XPos - Left), (YPos - Top))) then
      RESULT := htTopLeft
        // TOPRIGHT
    else if PtInRect(Rect((Width - 4), 0, Width, 4), Point((XPos - Left), (YPos - Top))) then
      RESULT := htTopRight
        //BOTTOMLEFT
    else if PtInRect(Rect(0, (Height - 4), 4, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htBottomLeft
        // BOTTOMRIGHT
    else if PtInRect(Rect((Width - 4), (Height - 4), Width, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htBottomRight

      // Bewegen ohne Titlebar
    //else if RESULT = HTCLIENT then
    //  RESULT := htCaption
    else
      inherited;
end;
die 4 steht für den Bereich in welchem das ganze anfassbar ist zum strecken. Das diagonale Strecken ist allerdings hier noch nicht drinn, ist aber einfach zu erweitern..

freak24 31. Mai 2005 18:33

Re: Fenster Größe ändern ohne Border
 
Zitat:

Zitat von SirThornberry
eigentlich ganz einfach wenn man weiß wie:

Jetzt weiß ich wie :wink:
Danke :-D

PS:
Zitat:

Zitat von SirThornberry
die 4 steht für den Bereich in welchem das ganze anfassbar ist zum strecken. Das diagonale Strecken ist allerdings hier noch nicht drinn, ist aber einfach zu erweitern..

Ein bisschen kann ich ja auch noch selber machen...

Coder90 23. Jul 2006 17:10

Re: Fenster Größe ändern ohne Border
 
Hi
Vielen Dank für den Code!
Wie schon gesagt funktionierte das diagonale Strecken nicht.

Hier der korrigierte Code mit allen 8 Streckrichtungen:
Delphi-Quellcode:
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;

...

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  DefaultHandler(Msg);
  with Msg do
      // TOPLEFT
    if PtInRect(Rect(0, 0, 4, 4), Point((XPos - Left), (YPos - Top))) then
      RESULT := htTopLeft
      // TOPRIGHT
    else if PtInRect(Rect((Width - 4), 0, Width, 4), Point((XPos - Left), (YPos - Top))) then
      RESULT := htTopRight
      // BOTTOMLEFT
    else if PtInRect(Rect(0, (Height - 4), 4, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htBottomLeft
      // BOTTOMRIGHT
    else if PtInRect(Rect((Width - 4), (Height - 4), Width, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htBottomRight
      // TOP
    else if PtInRect(Rect(0, 0, Width, 4), Point((XPos - Left), (YPos - Top))) then
      RESULT := htTop
      // LEFT
    else if PtInRect(Rect(0, 0, 4, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htLeft
      // BOTTOM
    else if PtInRect(Rect(0, Height - 4, Width, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htBottom
      // RIGHT
    else if PtInRect(Rect((Width - 4), 0, Width, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htRight
      // Bewegen ohne Titlebar
    {else if RESULT = HTCLIENT then
      RESULT := htCaption}
    else
      inherited;
end;
Danke nochmal!

MfG, Coder90


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz