Einzelnen Beitrag anzeigen

Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#14

Re: Abartig riesiger Resize-Rahmen bei Vista

  Alt 15. Okt 2007, 10:36
Morgen,

verdammter roter Kasten 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.
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat