Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: VCL / WinForms / Controls (https://www.delphipraxis.net/24-library-vcl-winforms-controls/)
-   -   Delphi bsNone Form verschieben und Größe ändern (https://www.delphipraxis.net/89050-bsnone-form-verschieben-und-groesse-aendern.html)

halinchen 25. Mär 2007 11:27


bsNone Form verschieben und Größe ändern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Sobald eine Form der BorderStyle auf bsNone gestellt wird, lässt sich die Form (!) zur Laufzeit (!) nicht so einfach verschieben und vergrößern. Eine Lösungen findet ihr hier:

(Auf die Lösungen bin ich zum Teil durch Mazel (hier gekommen)

Lösung (Mit Form-Designer)
An allen Ränder der Form ein TImage positionieren (Align = alTop;alLeft;alRight;alBottom). (Das ganze kann man auch mit Labels machen, hier nur AutoSize auf false; Caption auf '' und transparent auf true)
Außerdem noch ein kleineres Image (bzw. Label), was auch alTop ist, aber höher als das 1. ist. (das ist der Rand zum Vergrößern, das andere ist die Titelzeile (falls benötigt)).
Die Dicke aller ungefähr auf 5 Pixel einstellen. Die Titelzeile natürlich breiter wählen.

Dann noch in alle Ecken ein Image (bzw. Label), welches quadratisch ist und nicht allzu groß (14x14).
(Diese Eck-Images müssen im OnResize Ereignis noch in die Ecken gebracht werden!!
Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
begin
Rechtsunten.Left := Form1.ClientWidth - Rechtsunten.Width;
Rechtsunten.Top := Form1.ClientHeight - Rechtsunten.Height;

RechtsOben.Left := Form1.ClientWidth - Rechtsoben.Width;
RechtsOben.Top := 0;

LinksUnten.Left := 0;
LinksUnten.Top := Form1.ClientHeight - LinksUnten.Height;

end;
)


Im Ereignis OnMouseDown der Titelzeile:
Delphi-Quellcode:
//Fängt alle Mausereignisse ab
  ReleaseCapture;
  // mit TWinCotrol verschieben, $F012 verschiebt die Form
  Form.Perform(WM_SYSCOMMAND, $F012, 0);
Beim linken Image in OnMouseDown:
Delphi-Quellcode:
  //Fängt alle Mausereignisse ab
  ReleaseCapture;
 
  Form1.Perform(WM_SYSCOMMAND, $F001, 0);
Die Weiteren Werte des zweiten Parameters erklärt Mazel hier.
Zitat:

Zitat von Mazel
$F001 - ändert Größe nach Links
$F002 - ändert Größe nach Rechts
$F003 - ändert Größe nach Oben
$F006 - ändert Größe nach Unten

$F004 - ändert Größe nach Links, Oben
$F005 - ändert Größe nach Rechts, Oben
$F007 - ändert Größe nach Links, Unten
$F008 - ändert Größe nach Rechts, Unten

Somit die anderen Images das Ereignis OnMouseDown abändern.

Das Optimale an den Images ist, das man gleich ein Bitmap für den Rand (Der Rand ist ja bei bsNone auch verschwunden) und den Maus-Cursor festlegen kann.

SirThornberry 25. Mär 2007 11:38

Re: bsNone Form verschieben und Größe ändern
 
die Lösung mit den Images ist sehr unschön. Denn genau dafür gibt es die Message WM_NCHITTEST. Wenn man diese behandelt kann man bestimmen ob und wo das größe ändern und verschieben möglich sein soll.
Delphi-Quellcode:
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 - 30), 30, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htBottomLeft
        // BOTTOMRIGHT
    else if PtInRect(Rect((Width - 30), (Height - 30), Width, Height), Point((XPos - Left), (YPos - Top))) then
      RESULT := htBottomRight

      // Bewegen ohne Titlebar
    //else if RESULT = HTCLIENT then
    //  RESULT := htCaption
    else
      inherited;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 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