이 질문은 몇 번 했었는데 아시는 분이 없는지 아니면 다른 이유에서인지 답변이
안올라 오더군요.
폼에 TShape과 같은 모양의 컨트롤을 올려놓고 디자인하는 프로그램을 만들고 있습니다.
자료실에 보니까 엽기라는 이름으로 폼디자이너~ 라는 프로그램을 올려 놓으셨더군요.
저도 그와 비슷한 프로그램을 만들고 싶거든요. 저의 경우는 한가지 컨트롤만 다루면 되구요, 컨트롤을 눌렀을 때 조절점을 만들어서 크기조절과 이동을 할 수 있으면 좋겠습니다. 저장시에는 연관된 db에 정보를 저장하고 차후 이 폼을 불러 쓸 생각인데요.
아시는 분은 참고 말씀이라도 해주시면 왕 감사하겠습니다.
일부러 하실 필요는 없습니다..
예제) 만일 버튼을 클릭했을때 버튼에 조절점을 만들고 싶다면 버튼의 OnClick
이벤트를 다음과 같이 작성하시면 됩니다.
procedure TForm1.Button1Click(Sender: TObject);
begin
TControlSizer.Create(Self, Sender as TControl);
end;
버튼에서 다른 컨트롤로 포커스가 이동하면 조절점제어 컨트롤은 자동으로 파괴됩니다
코드는 간단하니까 분석해 보세요...
unit CtrlSize;
interface
uses
Classes, Windows, Messages, Controls, StdCtrls;
const
sc_DragMove: Longint = $F012;
type
TControlSizer = class(TCustomControl)
private
FControl: TControl;
FRectList: array [1..8] of TRect;
FPosList: array [1..8] of Integer;
public
constructor Create(AOwner: TComponent; AControl: TControl);
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateHandle; override;
procedure WmNcHitTest(var Msg: TWmNcHitTest); message WM_NCHITTEST;
procedure WmSize(var Msg: TWmSize); message WM_SIZE;
procedure WmLButtonDown(var Msg: TWmLButtonDown); message WM_LBUTTONDOWN;
procedure WmMove(var Msg: TWmMove); message WM_MOVE;
procedure Paint; override;
procedure ControlSizerExit(Sender: TObject);
end;
implementation
uses Graphics;
constructor TControlSizer.Create(AOwner: TComponent; AControl: TControl);
var
R: TRect;
begin
inherited Create(AOwner);
FControl := AControl;
OnExit := ControlSizerExit;
R := FControl.BoundsRect;
InflateRect(R, 2, 2);
BoundsRect := R;
Parent := FControl.Parent;
FPosList [1] := htTopLeft;
FPosList [2] := htTop;
FPosList [3] := htTopRight;
FPosList [4] := htRight;
FPosList [5] := htBottomRight;
FPosList [6] := htBottom;
FPosList [7] := htBottomLeft;
FPosList [8] := htLeft;
end;
procedure TControlSizer.CreateHandle;
begin
inherited CreateHandle;
SetFocus;
end;
procedure TControlSizer.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle + ws_ex_Transparent;
end;
procedure TControlSizer.Paint;
var
I: Integer;
begin
Canvas.Brush.Color := clBlack;
for I := 1 to 8 do
Canvas.Rectangle(FRectList [I].Left, FRectList [I].Top,
FRectList [I].Right, FRectList [I].Bottom);
end;
procedure TControlSizer.WmNcHitTest(var Msg: TWmNcHitTest);
var
Pt: TPoint;
I: Integer;
begin
Pt := Point(Msg.XPos, Msg.YPos);
Pt := ScreenToClient(Pt);
Msg.Result := 0;
for I := 1 to 8 do
if PtInRect(FRectList [I], Pt) then
Msg.Result := FPosList [I];
if Msg.Result = 0 then
inherited;
end;
procedure TControlSizer.WmSize(var Msg: TWmSize);
var
R: TRect;
begin
R := BoundsRect;
InflateRect(R, -2, -2);
FControl.BoundsRect := R;
FRectList [1] := Rect(0, 0, 5, 5);
FRectList [2] := Rect(Width div 2 - 3, 0,
Width div 2 + 2, 5);
FRectList [3] := Rect(Width - 5, 0, Width, 5);
FRectList [4] := Rect(Width - 5, Height div 2 - 3,
Width, Height div 2 + 2);
FRectList [5] := Rect(Width - 5, Height - 5,
Width, Height);
FRectList [6] := Rect(Width div 2 - 3, Height - 5,
Width div 2 + 2, Height);
FRectList [7] := Rect(0, Height - 5, 5, Height);
FRectList [8] := Rect(0, Height div 2 - 3,
5, Height div 2 + 2);
end;
procedure TControlSizer.ControlSizerExit(Sender: TObject);
begin
Free;
end;
procedure TControlSizer.WmLButtonDown(var Msg: TWmLButtonDown);
begin
Perform(wm_SysCommand, sc_DragMove, 0);
end;
procedure TControlSizer.WmMove(var Msg: TWmMove);
var
R: TRect;
begin
R := BoundsRect;
InflateRect(R, -2, -2);
FControl.Invalidate;
FControl.BoundsRect := R;
end;
end.