在做的系统中有一个需要,要做到下面的要求
1、在form上画出一个红色的方框,方框大小固定。
2、用鼠标左键选择方框(不松开左键)后可以用鼠标移动到方框任意位置,方框左键以后方框显示在移动后的位置,得到方框左上顶点和form左上顶点的距离(x,y)。
3、移动到适当位置以后可以用输入角度的方式旋转方框(已方框中线为轴)。请问这样的需求该怎么实现呢,要是有好的想法请提供,分数不够再加。

解决方案 »

  1.   

    提示:
    由于你第3步要求旋转。
    所以建立用一个TShape控件。
    然后在from的MouseDown, MouseMove, MouseUp三事件中写代码,即可实现你要求的1,2。
      

  2.   

    呵呵又想了一下。
    TShape控件也不能旋转呀,
    还是直接在Canvas上画吧。
      

  3.   

    http://community.csdn.net/Expert/topic/3654/3654301.xml?temp=.6977198
    帮忙看看。谢谢!
      

  4.   

    看书的时时候照书上做的练习,恰好实现了你要求的功能1、2,但是没有第三个。
    你参考着改改吧:unit UntCanDrag;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;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);
      private
        { Private declarations }
        RectDragging : Boolean;
        OldRect : TRect;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      RectDragging := True;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if RectDragging then
      begin
        Canvas.Pen.Width := 2;
        if GetRop2(Canvas.Handle) <> R2_NOT then
           SetRop2(Canvas.Handle, R2_NOT);
        Canvas.Brush.Style := bsClear;
        Canvas.Rectangle(OldRect.Left, oldRect.Top, OldRect.Right, OldRect.Bottom);
        Canvas.Rectangle(X-20, Y-20, X+20, Y+20);
        OldRect := Rect(X-20, Y-20, X+20, Y+20);
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      RectDragging := False;
    end;end.