unit Unit1;

interface

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

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 FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses
  GDIPAPI,GDIPOBJ;
var
  x:Integer = 20;
  y:Integer = 20;
  w:Integer = 100;
  h:Integer = 50;
  f:Byte;
  a,b:Integer;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  f:=1;       //标志致1,表示开始绘画了
  a:=x;    //鼠标按下了,记下这个坐标;
  b:=y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if f = 0 then
  Exit;
  if ssCtrl in Shift then   //ssCtrl是键盘传过来的消息,Shift是集合类型,所以用运算符IN
  begin
    f:=2;    //标志致2,时刻绘画重新调整后的图案;
    Text:='Ctrl 键被按下, 鼠标可调整大小';
  end
  else
  begin
    Text:='没有按下 Ctrl 键, 鼠标可调整位置';
  end;
//---------------------------------------------------------------------------
  a := X - a;    //计算自鼠标按下---到---鼠标移动到的位置(相对距离)
  b := Y - b;
  Repaint;   //重画
  a := X;         //保存好现在鼠标所在的位置
  b := Y;
//----------------------------------------------------------------------------
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  f:=0;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
begin
  Form1.DoubleBuffered:=True; //开启双缓冲后客户区就不闪烁了;
  g := TGPGraphics.Create(Canvas.Handle);
  g.Clear(aclWhite);
  p:=TGPPen.Create(aclRed);
  case f of
    1: begin       //如果键盘上没有按下Ctrl键将执行此步计算
      Inc(x,a);    //图案移动的关键在这里,这里的x是全局变量,因此还是20
      Inc(y,b);
    end;
    2: begin
      Inc(w,a);   //如果键盘上按下Ctrl键将执行这里,此时圆的第一个坐标没变,我们来改变它的宽高;
      Inc(h,b);
    end;
  end;
  g.DrawEllipse(p, x, y, w, h);
  p.Free;
  g.Free;
end;

{画一个圆需要两个坐标,例如(x:20,y:20)和(w:100,h:50),程序运行时我按这两个坐标画了一个圆,
  这是我们就能看窗体客户上有了一个圆,那么我怎样移动这个圆呢?我在(x:20,y:20)按下鼠标左键,
  那么(a=x=20,b=y=20),然后移动,一直移到(newX:50,newY:50),那么相对距离是多少呢?是(a=newX-a=30,
  b=newY-b=30),那么我只要在INC(x,a)=50,INC(y,b)=50处画圆大家就能看到原来的圆出现在新的位置了,这
  就是“移动”)}

end.

posted on 2010-12-31 10:47  巅枫  阅读(1130)  评论(0编辑  收藏  举报