Q&A

  • 컨트롤에 조절점 만들기
이 질문은 몇 번 했었는데 아시는 분이 없는지 아니면 다른 이유에서인지 답변이

안올라 오더군요.



폼에 TShape과 같은 모양의 컨트롤을 올려놓고 디자인하는 프로그램을 만들고 있습니다.

자료실에 보니까 엽기라는 이름으로 폼디자이너~ 라는 프로그램을 올려 놓으셨더군요.

저도 그와 비슷한 프로그램을 만들고 싶거든요. 저의 경우는 한가지 컨트롤만 다루면 되구요, 컨트롤을 눌렀을 때 조절점을 만들어서 크기조절과 이동을 할 수 있으면 좋겠습니다. 저장시에는 연관된 db에 정보를 저장하고 차후 이 폼을 불러 쓸 생각인데요.



아시는 분은 참고 말씀이라도 해주시면 왕 감사하겠습니다.

1  COMMENTS
  • Profile
    최용일 2001.06.16 02:00
    아래의 조절점제어 컨트롤을 사용하세요... 조절점을 제어하고 싶은 시점에서 TControlSizer의 인스턴스를 만들면 됩니다. 컨트롤의 파괴는 deactivate되면 자동으로 파괴되니까

    일부러 하실 필요는 없습니다..



    예제) 만일 버튼을 클릭했을때 버튼에 조절점을 만들고 싶다면 버튼의 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.

    • 최용일
      2000.03.13 08:53
      다음과 같은 형식으로 폼의 OnCreate이벤트를 작성하시면 됩니다. cnt에 대한 자세한 설명이 없어서 제가 ...
    • 강민주
    • 2000.03.13 05:41
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.03.13 08:03
      안녕하세요... 델파이 날짜관련함수에 다음달의 날짜를 구할수 있는 IncMonth라는 함수가 있습니다. 년도...
    • jack
    • 2000.03.13 03:17
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.03.13 09:51
      이미지 에디터는 델파이에 딸린 걸 말하는거 맞나요? 이미지에디터는 포준 리소스타입중 단지 비트맵,아이...
    • 정호원
    • 2000.03.13 02:42
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 2000.03.13 09:57
      질문의 요지가 뭡니까? 도대체 알 수가 없군요... "... 프로그램을 만들려고 합니다. ... 만드는 작업...
    • 소심남
    • 2000.03.12 23:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.03.13 00:57
      오늘날짜(Now함수로 구함, Sysutil에 있슴)에서 생일(문저열을 TDate형태로 StrToDate함수를 이용하여 바...
    • 지뇽이
    • 2000.03.12 12:01
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김종섭
      2000.03.14 09:38
      지뇽이 wrote: > 왕 초보임다 ㅡ,,ㅡ > 인터베이스에서 스토어드 프로시져의 입력 삭제 수정을 알고 싶습...
    • 지뇽이
      2000.03.15 08:35
      김종섭 wrote: > 지뇽이 wrote: > > 왕 초보임다 ㅡ,,ㅡ > > 인터베이스에서 스토어드 프로시져의 입력 ...
    • 김필립
    • 2000.03.12 10:01
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 장은석
      2000.03.12 13:47
      김필립 wrote: > 안녕하세요. 1주일 전에 델파이를 시작한 왕초보입니다. > 저는 책을 가지고 공부를 ...
    • 최용일
      2000.03.12 12:06
      델피언이 되신걸 축하합니다... 헐... 어떻게 얘기해야할지... 문법은 델파이에서 정해놓은 규칙들입니...
    • 조씨
    • 2000.03.12 09:04
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.03.12 05:31
      레지스트리에 등록하는 방법과 탐색기의 폴더옵션을 이용하는 방법이 있습니다. 어차피 두가지 다 같은 일...
    • 장은석
      2000.03.12 03:11
      박성훈 wrote: > 탐색기에서 해당파일을 더블클릭하면 관련프로그램이 실행되면서 해당파일이 자동으로 >...
    • 박성훈
    • 2000.03.12 02:26
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2001.06.16 02:00
      아래의 조절점제어 컨트롤을 사용하세요... 조절점을 제어하고 싶은 시점에서 TControlSizer의 인스턴스를 ...
    • 박성훈
    • 2000.03.12 02:20
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2000.03.13 21:48
      copy 명령으로 화일의 복서는 가능합니다. 하지만 파라독스는 프로그램이 완전히 종료되기 전까지의 데이...
    • 장은석
      2000.03.12 03:19
      박성훈 wrote: > 델3에서 파라독스를 사용하고 있습니다. > 파라독스가 불편한게 좀 많더군요. > > 제...
    • hee
    • 2000.03.12 01:47
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 장은석
      2000.03.12 03:05
      hee wrote: > 프로젝트를 열면 유닛 화일과 폼이 같이 뜨던데요 폼을 닫아 버리고 다시 열었는데 이제는 ...
    • 최종민
      2000.03.12 02:57
      어...이거 제가 답변 할 수 있을 거 같네요... 폼이 아예 안뜬다면... View - Forms를 누르면... 어떤 ...
    • 정종필
      2010.12.10 20:34
      다중모니터에서 폼을 열어서 작업하시다가.. 폼을 기본모니터가 아닌 위치에 가져가 놓고 프로젝트를 ...
    • 이수정
    • 2000.03.12 01:42
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2000.03.12 08:02
      켁.. 델파이로는 불가능하다...라는 말씀은.. 허허.. 델파이에서 불가능하다면 C++로도 불가능합니다. ^...
    • 바보
      2000.03.18 10:15
      UBS를 이용한 비디오 켑쳐 API AVICAP32.DLL를 통해서 contol하는데.. C:Program FilesCommon FilesBorl...
    • 최종민
    • 2000.03.12 01:35
    • 2 COMMENTS
    • /
    • 0 LIKES
    • htyou
      2000.03.13 19:06
      어떤식으로 프로그램을 구현하려고 하시는지는 잘모르겠습니다만 한번에 6000개의 데이터를 나타내려면 Te...
    • 최종민
      2000.03.13 22:42
      htyou wrote: > 어떤식으로 프로그램을 구현하려고 하시는지는 잘모르겠습니다만 > 한번에 6000개의 데이...
    • 임형호
      2000.03.12 01:59
      박대규 wrote: > 안녕하세요.. 델파이를 사랑하는 여러분... > > 다름이 아니라 하나의 테이블을 10개...
    • 박성훈
      2000.03.12 01:54
      박대규 wrote: > 안녕하세요.. 델파이를 사랑하는 여러분... > > 다름이 아니라 하나의 테이블을 10개...
    • 최명관
    • 2000.03.12 00:33
    • 1 COMMENTS
    • /
    • 0 LIKES
    • bluesky
      2000.03.12 06:31
      최명관 wrote: > * 사용환경 : 델파이4 와 WINDOWS NT4.0을 사용하고 있습니다. > > 전화 대 전화로 1...
    • 최일성
    • 2000.03.11 23:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박성훈
      2000.03.12 02:04
      최일성 wrote: > 안녕하세여! > 이제 델파이를 배우기시작한 사람인데여 > 레코드를 계산하려면 어케해...