delphi对无边框窗口的操作

目录

一、实现模拟标题栏进行拖动窗口位置

二、实现对窗口伸缩

三、拖动的同时进行等比例控件缩放


一、实现模拟标题栏进行拖动窗口位置

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

致谢:链接:delphi自动根据窗体大小缩放控件大小_delphi formresizer 缩放-CSDN博客

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值