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.