AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: VCL / WinForms / Controls Delphi bsNone Form verschieben und Größe ändern
Thema durchsuchen
Ansicht
Themen-Optionen

bsNone Form verschieben und Größe ändern

Ein Thema von halinchen · begonnen am 25. Mär 2007 · letzter Beitrag vom 25. Mär 2007
Antwort Antwort
Benutzerbild von halinchen
halinchen

Registriert seit: 13. Jun 2006
508 Beiträge
 
Delphi 2007 Professional
 
#1

bsNone Form verschieben und Größe ändern

  Alt 25. Mär 2007, 12:27
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 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.
Angehängte Dateien
Dateityp: zip beispielprojekt_141.zip (4,6 KB, 100x aufgerufen)
Dateityp: zip beispielprojekt__exe__881.zip (202,7 KB, 106x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: bsNone Form verschieben und Größe ändern

  Alt 25. Mär 2007, 12:38
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 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