目录
一、实现模拟标题栏进行拖动窗口位置
private:
FDragging: Boolean;
FStartDragPoint: TPoint;
procedure TMyProcessManagerForm.MainContext_ImageButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
FDragging := True;
FStartDragPoint := Point(X, Y);
end;
end;
procedure TMyProcessManagerForm.MainContext_ImageButtonMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if FDragging then
begin
Left := Left + (X - FStartDragPoint.X);
Top := Top + (Y - FStartDragPoint.Y);
end;
end;
procedure TMyProcessManagerForm.MainContext_ImageButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FDragging := False;
end;
二、实现对窗口伸缩
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
procedure TMyProcessManagerForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
FDragging := True;
FDragStartPos := Point(X, Y);
end;
end;
procedure TMyProcessManagerForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if FDragging then
begin
Left := Left + X - FDragStartPos.X;
Top := Top + Y - FDragStartPos.Y;
end;
end;
procedure TMyProcessManagerForm.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FDragging := False;
end;
procedure TMyProcessManagerForm.WMNCHITTEST(var Msg: TWMNCHITTEST);
const
cOffset = 10;
var
vPoint: TPoint;
begin
inherited;
//Msg.Result := HTBOTTOMRIGHT;
vPoint := ScreenToClient(Point(Msg.XPos, Msg.YPos));
if PtInRect(Rect(0, 0, cOffset, cOffset), vPoint) then
Msg.Result := HTTOPLEFT
else if PtInRect(Rect(Width - cOffset, Height - cOffset, Width, Height), vPoint) then
Msg.Result := HTBOTTOMRIGHT
else if PtInRect(Rect(Width - cOffset, 0, Width, cOffset), vPoint) then
Msg.Result := HTTOPRIGHT
else if PtInRect(Rect(0, Height - cOffset, cOffset, Height), vPoint) then
Msg.Result := HTBOTTOMLEFT
else if PtInRect(Rect(cOffset, 0, Width - cOffset, cOffset), vPoint) then
Msg.Result := HTTOP
else if PtInRect(Rect(0, cOffset, cOffset, Height - cOffset), vPoint) then
Msg.Result := HTLEFT
else if PtInRect(Rect(Width - cOffset, cOffset, Width, Height - cOffset), vPoint) then
Msg.Result := HTRIGHT
else if PtInRect(Rect(cOffset, Height - cOffset, Width - cOffset, Height), vPoint) then
Msg.Result := HTBOTTOM;
end;
三、拖动的同时进行等比例控件缩放
private:
cch: Integer; //初始的窗体高度
ccw: Integer; //初始的窗体宽度
chlst: array of Integer; //初始的控件高度数组
cwlst: array of Integer; //初始的控件宽度数组
cplst: array of Integer; //初始的控件距离窗口上端的距离数组
cllst: array of Integer; //初始的控件距离窗口左端的距离数组
carr: array of TControl; //存放所有窗体控件数组
procedure TMyProcessManagerForm.FormCreate(Sender: TObject);
begin
cch := 0; //初始的窗体高度
ccw := 0; //初始的窗体宽度
cch := self.Height; //初始化窗口宽高
ccw := self.Width;
for i := 0 to ControlCount - 1 do
begin
SetLength(chlst, i + 1); //给初始控件的高度数组设置大小。
chlst[i] := Controls[i].Height; //给初始控件的高度数组设置值。以下均同
SetLength(cwlst, i + 1); //宽度
cwlst[i] := Controls[i].Width;
SetLength(cplst, i + 1); //距离窗口上端的距离
cplst[i] := Controls[i].Top;
SetLength(cllst, i + 1); //距离窗口左端的距离
cllst[i] := Controls[i].Left;
SetLength(carr, i + 1); //最后一步,给存放所有窗体控件数组添加元素
carr[i] := Controls[i];
end;
end
procedure TMyProcessManagerForm.FormResize(Sender: TObject);
var
ch: Integer;
cw: Integer;
i, avgh, avgw, avgp, avgl: Integer;
begin
ch := self.Height; //定义两个变量,用于获取窗体大小改变后的高度和宽度值。
cw := self.Width;
for i := 0 to Length(carr) - 1 do
begin
avgh := round(chlst[i] * (ch / cch)); //获取平均改动值,用了【控件原高度x(窗体高度 / 窗体原高度)】公式。
avgw := round(cwlst[i] * (cw / ccw));
avgp := round(cplst[i] * (ch / cch));
avgl := round(cllst[i] * (cw / ccw));
carr[i].Height := avgh; //应用平均改动值
carr[i].Width := avgw;
carr[i].Top := avgp;
carr[i].Left := avgl;
end;
end