运行期实现控件移动和缩放

本文介绍了一个图形用户界面中矩形选择和调整大小的功能实现方法。通过鼠标操作,用户可以选取一个矩形区域并对其进行多种方式的调整,包括移动、改变宽度、高度等。文章详细展示了如何根据不同鼠标位置和操作类型来改变矩形的属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

const
  SETONW_CHANGE=0;
  STOS_CHANGE=1;
  SWTONE_CHANGE=2;
  ETOW_CHANGE=3;
  WTOE_CHANGE=4;
  NETOSW_CHANGE=5;
  NTOS_CHANGE=6;
  NWTOSE_CHANGE=7;
  MOVE_CHANGE=8;

type
  TForm1 = class(TForm)
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
    procedure DrawSelectState();


  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  trtRect:TRect;
  x0,y0:Integer;
  x1,y1:Integer;
  bRecord:Boolean;
  bMoveed:Boolean;
  bSelect:Boolean;
  trtCalc1:TRect;
  trtSelectRect:array[0..7] of TRect;
  iChangeType:Integer;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if bSelect then
  begin
    x0:=x;
    y0:=y;
    x1:=x;
    y1:=y;
    if PtInRect(trtSelectRect[7],Point(x,y)) then
    begin
      bRecord:=True;
      bMoveed:=True;
      iChangeType:=NWTOSE_CHANGE;
      Exit;
    end;
    if PtInRect(trtSelectRect[0],Point(x,y)) then
    begin
      bRecord:=True;
      bMoveed:=True;
      iChangeType:=SETONW_CHANGE;
      Exit;
    end;
    if PtInRect(trtSelectRect[1],Point(x,y)) then
    begin
      bRecord:=True;
      bMoveed:=True;
      iChangeType:=STOS_CHANGE;
      Exit;
    end;
    if PtInRect(trtSelectRect[6],Point(x,y)) then
    begin
      bRecord:=True;
      bMoveed:=True;
      iChangeType:= NTOS_CHANGE;
      Exit;
    end;
    if PtInRect(trtSelectRect[2],Point(x,y)) then
    begin
      bRecord:=True;
      bMoveed:=True;
      iChangeType:= SWTONE_CHANGE;
      Exit;
    end;
    if PtInRect(trtSelectRect[5],Point(x,y)) then
    begin
      bRecord:=True;
      bMoveed:=True;
      iChangeType:= NETOSW_CHANGE;
      Exit;
    end;

    if PtInRect(trtSelectRect[3],Point(x,y)) then
    begin
      bRecord:=True;
      bMoveed:=True;
      iChangeType:= ETOW_CHANGE;
      Exit;
    end;
    if PtInRect(trtSelectRect[4],Point(x,y)) then
    begin
      bRecord:=True;
      bMoveed:=True;
      iChangeType:= WTOE_CHANGE;
      Exit;
    end;


  end;

  if PtInRect(trtRect,Point(x,y)) then
  begin
    bSelect:=True;
    DrawSelectState;
  end   else
  begin
    if bSelect then
    begin

    bSelect:=False;
    Repaint;
    end;

    Exit;
  end;

  x0:=x;
  y0:=y;
  x1:=x;
  y1:=y;
  bRecord:=True;
  bMoveed:=True;
  CopyRect(trtCalc1,trtRect);
  iChangeType:=MOVE_CHANGE;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  trtCalc:TRect;
begin

  Cursor:=crDefault;
  if PtInRect(trtCalc1,Point(x,y)) then
  begin
    Cursor:=crSizeAll;
  end ;
  if bSelect then
  begin

    if (PtInRect(trtSelectRect[0],Point(x,y)) ) or (PtInRect(trtSelectRect[7],Point(x,y))) then
    begin
      Cursor:= crSizeNWSE ;
    end else
    if (PtInRect(trtSelectRect[1],Point(x,y)) ) or (PtInRect(trtSelectRect[6],Point(x,y))) then
    begin
      Cursor:= crSizeNS ;
    end else
    if (PtInRect(trtSelectRect[2],Point(x,y)) ) or (PtInRect(trtSelectRect[5],Point(x,y))) then
    begin
      Cursor:= crSizeNESW  ;
    end else
    if (PtInRect(trtSelectRect[3],Point(x,y)) ) or (PtInRect(trtSelectRect[4],Point(x,y))) then
    begin
      Cursor:= crSizeWE   ;
    end ;
  end;


  if not bRecord then
    exit;

  if iChangeType= ETOW_CHANGE then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
      Canvas.Rectangle(x1 , trtRect.Top , trtRect.Right, trtRect.Bottom);
    end else
      bMoveed:=False;
    Canvas.Rectangle(x  , trtRect.Top , trtRect.Right, trtRect.Bottom );
    x1:=x;
    y1:=y;
  end;
  if iChangeType= WTOE_CHANGE then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
      Canvas.Rectangle(trtRect.Left  , trtRect.Top , x1, trtRect.Bottom);
    end else
      bMoveed:=False;
    Canvas.Rectangle(trtRect.Left  , trtRect.Top , x, trtRect.Bottom );
    x1:=x;
    y1:=y;
  end;

  if iChangeType= SWTONE_CHANGE then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
      Canvas.Rectangle(trtRect.Left  , y1,x1, trtRect.Bottom);
    end else
      bMoveed:=False;
    Canvas.Rectangle(trtRect.Left  , y,x, trtRect.Bottom );
    x1:=x;
    y1:=y;
  end;

  if iChangeType= NETOSW_CHANGE then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
      Canvas.Rectangle(x1 , trtRect.top,trtRect.Right  , y1 );
    end else
      bMoveed:=False;
    Canvas.Rectangle(x , trtRect.top,trtRect.Right  , y );
    x1:=x;
    y1:=y;
  end;

  if iChangeType= NTOS_CHANGE then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
      Canvas.Rectangle(trtRect.Left,trtRect.Top,trtRect.Right,y1);
    end else
      bMoveed:=False;
    Canvas.Rectangle(trtRect.Left  , trtRect.Top,trtRect.Right,y );
    x1:=x;
    y1:=y;
  end;

  if iChangeType=STOS_CHANGE then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
      Canvas.Rectangle(trtRect.Left,y1,trtRect.Right,trtRect.Bottom);
    end else
      bMoveed:=False;
    Canvas.Rectangle(trtRect.Left  ,y,trtRect.Right,trtRect.Bottom );
    x1:=x;
    y1:=y;
  end;
 
  if SETONW_CHANGE=iChangeType then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
      Canvas.Rectangle(x1,y1,trtRect.Right,trtRect.Bottom);
    end else
      bMoveed:=False;
    Canvas.Rectangle(x,y,trtRect.Right,trtRect.Bottom );
    x1:=x;
    y1:=y;

  end;

  if iChangeType= NWTOSE_CHANGE then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
      Canvas.Rectangle(trtRect.Left,trtRect.Top,x1,y1);
    end else
      bMoveed:=False;
    Canvas.Rectangle(trtRect.Left,trtRect.Top,x,y );
    x1:=x;
    y1:=y;
  end;

  if iChangeType=MOVE_CHange then
  begin
    Canvas.Pen.Mode:=pmNotXor;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Style:=psDash;
    if not bMoveed then
    begin
    CopyRect(trtCalc,trtCalc1);
    Canvas.Rectangle(trtCalc);

    end else
      bMoveed:=False;

    CopyRect(trtCalc,trtRect);
    OffsetRect(trtCalc,x-x1,y-y1);
    Canvas.Rectangle(trtCalc);
    CopyRect(trtCalc1,trtCalc);

  end;

//ManipulateControl(edt1,Shift,X,Y,2);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
//
if bRecord then
begin
  bRecord:=False;

  if iChangeType= ETOW_CHANGE then
  begin
    trtRect.Left:=x;
  end;
  if iChangeType= WTOE_CHANGE then
  begin
    trtRect.right:=x;
  end;
  if iChangeType= SWTONE_CHANGE then
  begin
    trtRect.Right:=x;
    trtRect.Top:=y;
  end;

  if iChangeType= NETOSW_CHANGE then

  begin
    trtRect.Left:=x;
    trtRect.Bottom:=y;
  end;
  if iChangeType= NTOS_CHANGE then
  begin
    trtRect.Bottom:=y;

  end;
  if iChangeType=STOS_CHANGE then
  begin
    trtRect.top:=y;
  end;

  if iChangeType=SETONW_CHANGE then
  begin
    trtRect.left:=x;
    trtRect.top:=y;
  end;
  if iChangeType=NWTOSE_CHANGE then
  begin
    trtRect.Right:=x;
    trtRect.Bottom:=y;
  end;
  if iChangeType=MOVE_CHange then
  begin
  OffsetRect(trtRect,x-x1,y-y1);
  end;
  Repaint;

end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  trtRect:=Rect(100,100,200,200);
  bRecord:=False;
  bSelect:=False;
  CopyRect(trtCalc1,trtRect);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Brush.Style:=bsClear;
  Canvas.Pen.Style:=psSolid;
  Canvas.Pen.Color:=clBlack;
  Canvas.Pen.Mode:=pmCopy;
  Canvas.Rectangle(trtRect);
  if bSelect then
  begin
    DrawSelectState();
  end;
end;

 

 

procedure TForm1.DrawSelectState;
var
  trtFrame:TRect;
begin
  Canvas.Brush.Style:=bsSolid;
  Canvas.Brush.Color:=clWhite;
  Canvas.Pen.Style:=psSolid;

  trtFrame:=Rect(trtRect.TopLeft,trtRect.TopLeft);
  Windows.InflateRect(trtFrame,5,5);
  CopyRect(trtSelectRect[0],trtFrame);
  Canvas.Ellipse(trtFrame);

  trtFrame:=Rect(trtRect.Left+(( trtRect.Right-trtRect.Left) div 2) ,trtRect.Top,trtRect.Left+(( trtRect.Right-trtRect.Left) div 2) ,trtRect.Top);
  Windows.InflateRect(trtFrame,5,5);
  CopyRect(trtSelectRect[1],trtFrame);
  Canvas.Ellipse(trtFrame);

  trtFrame:=Rect(trtRect.Right,trtRect.Top,trtRect.Right,trtRect.Top);
  Windows.InflateRect(trtFrame,5,5);
  CopyRect(trtSelectRect[2],trtFrame);
  Canvas.Ellipse(trtFrame);

  trtFrame:=Rect(trtRect.Left,trtRect.top+(( trtRect.bottom-trtRect.top) div 2),trtRect.Left,trtRect.top+(( trtRect.bottom-trtRect.top) div 2));
  Windows.InflateRect(trtFrame,5,5);
  CopyRect(trtSelectRect[3],trtFrame);
  Canvas.Ellipse(trtFrame);

  trtFrame:=Rect(trtRect.Right,trtRect.top+(( trtRect.bottom-trtRect.top) div 2),trtRect.Right,trtRect.top+(( trtRect.bottom-trtRect.top) div 2));
  Windows.InflateRect(trtFrame,5,5);
  CopyRect(trtSelectRect[4],trtFrame);
  Canvas.Ellipse(trtFrame);


  trtFrame:=Rect(trtRect.Left,trtRect.Bottom,trtRect.Left,trtRect.Bottom);
  Windows.InflateRect(trtFrame,5,5);
  CopyRect(trtSelectRect[5],trtFrame);
  Canvas.Ellipse(trtFrame);

  trtFrame:=Rect(trtRect.Left+(( trtRect.Right-trtRect.Left) div 2) ,trtRect.Bottom,trtRect.Left+(( trtRect.Right-trtRect.Left) div 2) ,trtRect.Bottom);
  Windows.InflateRect(trtFrame,5,5);
  CopyRect(trtSelectRect[6],trtFrame);
  Canvas.Ellipse(trtFrame);


  trtFrame:=Rect(trtRect.BottomRight,trtRect.BottomRight);
  Windows.InflateRect(trtFrame,5,5);
  CopyRect(trtSelectRect[7],trtFrame);
  Canvas.Ellipse(trtFrame);

end;

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值