Delphi-PRAXiS
Seite 2 von 2     12   

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 Abartig riesiger Resize-Rahmen bei Vista (https://www.delphipraxis.net/101336-abartig-riesiger-resize-rahmen-bei-vista.html)

OregonGhost 12. Okt 2007 12:52

Re: Abartig riesiger Resize-Rahmen bei Vista
 
Dann lass den Windows-Rahmen weg und kümmere dich selbst darum. Dann wird Vista dir auch nicht reinpfuschen.

Edit: Es gab vor kurzem einen Thread in der DP, in dem das Verschieben und Resizen von rahmenlosen Fenstern besprochen wurde.

ralfiii 15. Okt 2007 10:02

Re: Abartig riesiger Resize-Rahmen bei Vista
 
Zitat:

Zitat von OregonGhost
Es gab vor kurzem einen Thread in der DP, in dem das Verschieben und Resizen von rahmenlosen Fenstern besprochen wurde.

Ich find den nicht... :gruebel:

Progman 15. Okt 2007 10:28

Re: Abartig riesiger Resize-Rahmen bei Vista
 
Vielleicht hilfr dir der folgende Code:
Delphi-Quellcode:
private
    { Private-Deklarationen }
    procedure NCHIT(var Msg : TWMNCHITTEST); message WM_NCHITTEST;
.
.
.

procedure TForm1.NCHIT(var Msg : TWMNCHITTEST);
var p  : Tpoint;
const a = 9;
var r,u : integer;
begin
     p.x       := msg.XPos;
     p.y       := msg.YPos;
     p         := screentoclient(p);
     msg.Result := HTCLIENT;
     {-}
     r         := self.width - a;
     u         := self.height - a;
     {-}
     if p.x > r then msg.Result := HTRIGHT;
     if p.y > u then msg.Result := HTBOTTOM;
     if PtInRect(Rect(r,u,self.width,self.height),p) then msg.Result := HTBOTTOMRIGHT;
end;
der stammt glaub ich aus dem o.g. Thread.

wicht 15. Okt 2007 10:36

Re: Abartig riesiger Resize-Rahmen bei Vista
 
Morgen,

verdammter roter Kasten :mrgreen: Naja.. Ich poste meinen Kram trotzdem.
Zum Resizen/Verschieben kann ich dir folgendes Codebeispiel anbieten:

Delphi-Quellcode:
type
  TfrmAppMain = class(TForm)
    procedure WMNCHitTest(var Message: TMessage); message WM_NCHITTEST;
    [...]

implementation

procedure TfrmAppMain.WMNCHitTest(var Message: TMessage);
var
  x, y: Integer;
  p: TPoint;
begin
  inherited;

  if Maximized then
    Exit;

  x := LoWord(Message.LParam);
  y := HiWord(Message.LParam);
  p.X := x;
  p.Y := y;
  p := ScreenToClient(p);

  if PtInRect(Rect(imgTopLeft.Left, imgTopLeft.Top,
                   imgTopLeft.Left + imgTopLeft.Width,
                   imgTopLeft.Top + imgTopLeft.Height), p)
  or PtInRect(Rect(imgMinimize.Left, imgMinimize.Top,
                   imgMinimize.Left + imgMinimize.Width,
                   imgMinimize.Top + imgMinimize.Height), p)
  or PtInRect(Rect(imgMaximize.Left, imgMaximize.Top,
                   imgMaximize.Left + imgMaximize.Width,
                   imgMaximize.Top + imgMaximize.Height), p)
  or PtInRect(Rect(imgClose.Left, imgClose.Top,
                   imgClose.Left + imgClose.Width,
                   imgClose.Top + imgClose.Height), p) then
  begin
    Exit;
  end;

  if PtInRect(Rect(5, 5, Width - 5, imgGradient.Height), p) then
    Message.Result := HTCAPTION;

  if PtInRect(Rect(5, 5, Width - 5, Height - 5), p) then
    Exit;

  if PtInRect(Rect(0, 0, 15, 15), p) then
  begin
    Message.Result := HTTOPLEFT;
    Exit;
  end;
  if PtInRect(Rect(Width - 15, 0, Width, 15), p) then
  begin
    Message.Result := HTTOPRIGHT;
    Exit;
  end;
  if PtInRect(Rect(0, Height - 15, 15, Height), p) then
  begin
    Message.Result := HTBOTTOMLEFT;
    Exit;
  end;
  if PtInRect(Rect(Width - 15, Height - 15, Width, Height), p) then
  begin
    Message.Result := HTBOTTOMRIGHT;
    Exit;
  end;

  if PtInRect(Rect(0, 0, imgGradient.Width, 5), p) then
    Message.Result := HTTOP;

  if PtInRect(Rect(0, 5, 5, Height - 5), p) then
    Message.Result := HTLEFT;

  if PtInRect(Rect(0, Height - 5, Width, Height), p) then
    Message.Result := HTBOTTOM;

  if PtInRect(Rect(Width - 5, 5, Width, Height), p) then
    Message.Result := HTRIGHT;
end;
Wie man da sieht, wird so ein HT... immer als Message.Result gesetzt, wenn man das Formular resizen oder verschieben können soll.
Kopier dir die Prozedur einfach und spiel ein bisschen damit rum.. Ist eigentlich wirklich einfach.

Edit: Vielleicht ist mein Zeugs hier auch unnötig kompliziert.. Naja, tat immer, darum ist es einfach so geblieben.. Ist auf jedenfall etwas länger als der Source von Progman, berücksichtigt dafür aber Sachen wie die Min/Max/Close Knöpfe.. Verhält sich jedenfalls fast so, wie ein "normales" Fenster.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.
Seite 2 von 2     12   

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