Q&A

  • 폼 2개의 연동
안녕하십니까..델파이로 어떠한 프로그램을 개발중인데여

한 가지 해결이 안되는 것이 있어서 이렇게 질문을 드립니다.

간단할 것 같기도 한데 제가 머리가 안좋아서리...ㅡ.ㅡ;

폼이 2개가 있을때 한 폼을 마우스로 끌어 이동하면 다른 폼도 따라서 움직이게 하는 것입니다. 부디 방법을 가르쳐 주십시여.,....





3  COMMENTS
  • Profile
    최용일 2000.04.07 07:36
    안녕하세요. 최용일입니다.



    폼이 이동할때에는 WM_MOVING 메세지와 WM_MOVE메세지가 발생합니다.



    이걸 이용하시면 간단히 구현되는데요. 하지만 윈엠프처럼 하실려면



    여러가지 추가 작업을 하셔야 겠네요. 일단은 간단한 방법이니까 올립니다.



    type

    TForm1 = class(TForm)

    private

    // 폼 사이의 간격을 저장하는 변수

    LengthOfFormSide: TPoint;

    // WM_MOVE메세지에 반응하는 이벤트 메세지 핸들러

    Procedure OnMove(Var Msg:TMessage); Message WM_MOVE;

    // WM_MOVING메세지에 반응하는 이벤트 메세지 핸들러

    Procedure OnMoving(Var Msg:TMessage); Message WM_MOVING;

    end;



    var

    Form1: TForm1;



    implementation



    uses Unit2;



    {$R *.DFM}



    { TForm1 }



    procedure TForm1.OnMove(var Msg: TMessage);

    begin

    If Assigned(Form2) then // 폼2가 활성화 되어있어야 겠죠..

    begin

    Form2.Top := Top + LengthOfFormSide.X ;

    Form2.Left := Left + LengthOfFormSide.Y ;

    end;

    end;



    procedure TForm1.OnMoving(var Msg: TMessage);

    // 폼이 움직이기 시작할 때 폼사이의 간격을 저장합니다.

    begin

    LengthOfFormSide.X := Form2.Top - Top;

    LengthOfFormSide.Y := Form2.Left - Left;

    end;



    end.



    KJB wrote:

    > 안녕하십니까..델파이로 어떠한 프로그램을 개발중인데여

    > 한 가지 해결이 안되는 것이 있어서 이렇게 질문을 드립니다.

    > 간단할 것 같기도 한데 제가 머리가 안좋아서리...ㅡ.ㅡ;

    > 폼이 2개가 있을때 한 폼을 마우스로 끌어 이동하면 다른 폼도 따라서 움직이게 하는 것입니다. 부디 방법을 가르쳐 주십시여.,....

    >

    >

  • Profile
    조규춘 2000.04.07 03:17
    아래에 있는 내용은 예전에 최용일 님이 답변한 것을 복사해서 붙여 놓은 것입니다.

    이거 하시면 될꺼여요!



    역시 최용일님은 고수여요~! 히~! 힘내셔요 최용일님.. 오늘일 잊어버리시고..







    꼭! 꼭! wrote:

    > 초보라 도움이 필요합니다.

    > 두개의 폼을 동시에 움직이기 위해 다음과 같은 프로시져를 사용했어요.

    > procedure onmove(var msg : tmessage); message wm_move;

    > 첫번째 폼에서 버튼을 클릭하면 두번째 폼이 나오고 첫번째 폼의 제목 표시줄을

    > 가지고 움직이면 두번째 폼이 따라다니게요...

    >

    > 근데 폼의 제목 표시줄을 모두 없애고 (borderstyle = bsNone)

    > 이미지를 맨 위에다 갖다 놓아서 제목 표시줄 대신 사용하려고 하는데

    > 두개의 폼을 어떻게 동시에 움직이죠?

    > 마우스로 이미지를 가지고 움직여야 하는데 방법을 잘 모르겠어요.

    > 꼼짝을 하지 않는군요.

    > 자세하게 설명 좀 해주세요.







    WM_NCHITTEST 메세지에 반응하는 메소드를 서브클래싱해서 사용하시면 됩니다.



    즉, 마우스포인터의 위치를 검사해서 그곳이 이미지내이라면 메세지구조체의

    Result값에 htCaption을 넣어주시면 됩니다. 말하자면 이미지에서의 드래그를

    캡션바에서의 드래그로 속이는 것입니다.



    아래는 간단한 예제입니다.



    type

    TForm1 = class(TForm)

    Image1: TImage;

    public

    procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;

    end;



    ...



    procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);

    var

    P: TPoint;

    ImageRect: TRect;

    begin

    // 마우스 좌표를 구합니다.

    P := Point(Msg.XPos, Msg.YPos);

    // 마우스 좌표를 클라이언트 좌표로 바꿉니다.

    P := ScreenToClient(P);

    ImageRect := Rect(Image1.Left, Image1.Top, Image1.left +Image1.Width,

    Image1.top+ Image1.Height);

    // 마우스 포인터가 이미지 내에 있다면

    if PtInRect(ImageRect, P) then

    Msg.Result := htcaption // 캡션바에서 일어난 일인 것처럼 폼을 속인다.

    else

    inherited;

    end;



    end.





  • Profile
    KJB 2000.04.07 07:21
    저랑 같은 질문을 하신 분이 계셨군여...

    여기 자료가 너무 많아서 제목으로 찾으려 했더니 찾을 수가 없었습니다.

    저으 불찰입니다...ㅡ.ㅡ;

    어째듯 조규춘님께도 감사드립니다.