안녕하세요.델파이 초보자 입니다.
질문을 어떻게 해야할지.
소스 그대로 올립니다.
사각 박스로 특정 영역을 지정해 주는 것입니다.
콤포넌트등록하구(수고스럽지만..) 폼에 올려 놓고.
실행을 하면 박스가 나옵니다. (점선으로..)
그 점선 박스의 8곳에 6X6 pixel이 보입니다. (검은색으로..)
이 영역이 점선 박스의 사이즈를 줄이거나 늘리거나 할수 있는 곳입니다.
그런데..
영역을 사각박스 외부에서도 하고 싶은데..
어떻게 해야 할지 몰라서..
내부에만 되어 있습니다.. (가만 보면 모양이 영...)
고수님들의 조언 부탁드립니다..
그럼 좋은 하루 되십시오..
[소스]
unit xdBox;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TxdBox = class(TGraphicControl)
private
{ Private declarations }
FMouseDown : Boolean;
FMouseDownPos : TPoint;
FMoveEnabled : Boolean;
FSizeEnabled : Boolean;
FStep : Integer;
function CheckFocusPoint(X, Y: Integer): Integer;
procedure Drawing(Offset : TPoint);
procedure SetStep(const Value: Integer);
procedure DrawCrossMark;
procedure DrawSizablePoint;
protected
{ Protected declarations }
procedure WMEraseBkgnd(var Message:TMessage); message WM_ERASEBKGND;
Procedure CMColorChanged(var Msg : TMessage); message CM_COLORCHANGED;
Procedure CMTextChanged(Var Message: TMessage); Message CM_TEXTCHANGED;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); Override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure Paint; override;
Property Step : Integer Read FStep Write SetStep;
published
{ Published declarations }
Property Color;
Property Caption;
Property MoveEnabled : Boolean Read FMoveEnabled Write FMoveEnabled Default True;
Property SizeEnabled : Boolean Read FSizeEnabled Write FSizeEnabled Default True;
Property OnCanResize;
Property OnClick;
Property OnConstrainedResize;
Property OnContextPopup;
Property OnDblClick;
Property OnDragDrop;
Property OnDragOver;
Property OnEndDock;
Property OnEndDrag;
Property OnMouseDown;
Property OnMouseMove;
Property OnMouseUp;
Property OnResize;
Property OnStartDock;
Property OnStartDrag;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TxdBox]);
end;
{ TxdBox }
function TxdBox.CheckFocusPoint(X, Y: Integer): Integer;
begin
Result := (-1);
// 왼쪽 위
If ptInRect(RECT(0 - 5, 0 - 5, 0 + 5, 0 + 5), Point(X, Y)) Then Result := 1
Else // 오른쪽 위
If ptInRect(RECT(Width - 5, 0 - 5, Width + 5, 0 + 5), Point(X, Y)) Then Result := 2
Else // 오른쪽 아래
If ptInRect(RECT(Width - 5, Height - 5, Width + 5, Height + 5), Point(X, Y)) Then Result := 3
Else // 왼쪽 아래
If ptInRect(RECT(0 - 5, Height - 5, 0 + 5, Height + 5), Point(X, Y)) Then Result := 4
Else // 왼쪽 가운데
If ptInRect(Rect(0 - 7, Height Div 2 - 7, 0 + 7, Height Div 2 + 7), Point(X, Y)) Then Result := 5
Else // 위쪽 가운데
If ptInRect(Rect(Width Div 2 - 7, 0 - 7, Width Div 2 + 7, 0 + 7), Point(X, Y)) Then Result := 6
Else // 오른쪽 가운데
If ptInRect(Rect(Width - 7, Height Div 2 - 7, Width + 7, Height Div 2 + 7), Point(X, Y)) Then Result := 7
Else // 아래쪽 가운데
If ptInRect(Rect(Width Div 2 - 7, Height - 7, Width Div 2 + 7, Height + 7), Point(X, Y)) Then Result := 8
Else // 움직일때..
If ptInRect(RECT(0, 0, Width, Height), Point(X, Y)) Then Result := 0
end;
procedure TxdBox.CMColorChanged(var Msg: TMessage);
begin
Invalidate;
end;
procedure TxdBox.CMTextChanged(var Message: TMessage);
begin
Invalidate;
end;
constructor TxdBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Color := clBlack;
Height := 100;
Width := 100;
FMoveEnabled := True;
FSizeEnabled := True;
end;
procedure TxdBox.DrawCrossMark;
Var
Center : TPoint;
begin
Center := Point(Width Div 2, Height Div 2);
With Canvas Do
Begin
Pen.Color := Color;
End;
end;
procedure TxdBox.Drawing(Offset: TPoint);
begin
Case Step Of
0 : Begin
If Not MoveEnabled Then Exit;
Left := Left + Offset.X;
Top := Top + Offset.Y;
End;
1 : Begin // 왼쪽 위
If Not SizeEnabled Then Exit;
Left := Left + Offset.X;
Top := Top + Offset.Y;
Width := Width - Offset.X;
Height := Height - Offset.Y;
End;
2 : Begin // 오른쪽 위
If Not SizeEnabled Then Exit;
Top := Top + Offset.Y;
Width := Width + Offset.X;
Height := Height - Offset.Y;
FMouseDownPos.X := FMouseDownPos.X + Offset.X;
End;
3 : Begin // 오늘쪽 아래
If Not SizeEnabled Then Exit;
Width := Width + Offset.X;
Height := Height + Offset.Y;
FMouseDownPos.X := FMouseDownPos.X + Offset.X;
FMouseDownPos.Y := FMouseDownPos.Y + Offset.Y;
End;
4 : Begin // 왼쪽 아래
If Not SizeEnabled Then Exit;
Left := Left + Offset.X;
Width := Width - Offset.X;
Height := Height + Offset.Y;
FMouseDownPos.Y := FMouseDownPos.Y + Offset.Y;
End;
5 : Begin // 왼쪽 가운데
If Not SizeEnabled Then Exit;
Left := Left + Offset.X;
Width := Width - Offset.X;
End;
6 : Begin // 위쪽 가운데
If Not SizeEnabled Then Exit;
Top := Top + Offset.Y;
Height := Height - Offset.y;
End;
7 : Begin // 오른쪽 가운데
If Not SizeEnabled Then Exit;
Width := Width + Offset.x;
FMouseDownPos.X := FMouseDownPos.X + Offset.X;
End;
8 : Begin // 아래쪽 가운데
If Not SizeEnabled Then Exit;
Height := Height + Offset.y;
FMouseDownPos.Y := FMouseDownPos.Y + Offset.Y;
End;
End;
end;
procedure TxdBox.DrawSizablePoint; // 여기가 영역표시 하는 부분입니다.
begin // 새까맣고 작은 네모 박스
With Canvas Do
Begin
Brush.Color := clBlack;
Brush.Style := bsSolid;
Rectangle(0, 0, 6, 6);
Rectangle((Width Div 2) - 3, 0, (Width Div 2) + 3, 6);
Rectangle(Width - 6, 0, Width, 6);
Rectangle(Width - 6, (Height Div 2) - 3, Width, (Height Div 2) + 3);
Rectangle(Width - 6, Height - 6, Width, Height);
Rectangle((Width Div 2) - 3, Height - 6, (Width Div 2) + 3, Height);
Rectangle(0, Height - 6, 6, Height);
Rectangle(0, (Height Div 2) - 3, 6, (Height Div 2) + 3);
End;
end;
procedure TxdBox.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
If (ssLeft In Shift) And Enabled Then // Mouse 왼쪽이 눌려 졌다.
Begin
FMouseDown := True;
FMouseDownPos := Point(X, Y);
Step := CheckFocusPoint(X, Y);
End;
// inherited MouseDown(Button, Shift, X, Y);
end;
procedure TxdBox.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
Cursor := crHandPoint;
If FMouseDown Then
Begin
Drawing(Point(X - FMouseDownPos.X, Y - FMouseDownPos.Y));
End
Else
Begin
Case CheckFocusPoint(X, Y) Of
0 : If MoveEnabled Then Cursor := crHandPoint;
1 : if SizeEnabled Then Cursor := crSizeNWSE;
2 : if SizeEnabled Then Cursor := crSizeNESW;
3 : if SizeEnabled Then Cursor := crSizeNWSE;
4 : if SizeEnabled Then Cursor := crSizeNESW;
5 : if SizeEnabled Then Cursor := crSizeWE;
6 : if SizeEnabled Then Cursor := crSizeNS;
7 : if SizeEnabled Then Cursor := crSizeWE;
8 : if SizeEnabled Then Cursor := crSizeNS;
Else
Cursor := crDefault;
End;
End;
Inherited MouseMove(Shift, X, Y);
end;
procedure TxdBox.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
X1, Y1, X2, Y2 : Integer;
begin
inherited MouseUp(Button, Shift, X, Y);
FMouseDown := False;
X1 := Left;
Y1 := Top;
X2 := Width;
Y2 := Height;
If X2 < 0 Then Left := Left + Width;
If X2 < 0 Then Width := X1 - Left;
If Y2 < 0 Then Top := Top + Height;
If Y2 < 0 Then Height := Y1 - Top;
end;
procedure TxdBox.Paint;
begin
With Canvas Do
Begin
Pen.Color := Color;
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, Width, Height);
TextOut(0,0, Caption);
DrawSizablePoint;
End;
end;
procedure TxdBox.SetStep(const Value: Integer);
begin
If Step <> Value Then
Begin
FStep := Value;
End;
end;
procedure TxdBox.WMEraseBkgnd(var Message: TMessage);
begin
Message.Result := 0;
end;
end.