Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
Delphi XE Professional
|
Re: Abartig riesiger Resize-Rahmen bei Vista
15. Okt 2007, 11: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.
|