|
: 전문가들이 보기에는 쉬운 문제지요.
: 폼의 boder style을 None으로 바꾸었어도
: 폼을 움직일 수 있게 하는 방법을 가르쳐 주세요.
:
: 델파이에서는 하는 방법을 겨우 알았는데 빌더로 바꾸기가 어렵군요.
:
: 여기서 쓰는 방법을 자세히 가르쳐 주세요.
: 그럼 정말 고맙겠습니다.
:
:
안녕하세요, 정진후라고 합니다.
저는 두가지 정도의 방법으로 구현을 해봤는데
크게 좋은 방법인지는 모르겠지만 어쨌든
도움이 되었으면 좋겠군요.
첫번째 방법은 직접 메시지 핸들러를
만드는 것이지요.
우선 헤더에 윈도우 메시지를 직접 받을 수 있는
핸들러를 선언합니다.
protected:
void __fastcall WMLButtonDown(TWMLButtonDown &Msg);
private:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_LBUTTONDOWN,TWMLButtonDown,WMLButtonDown)
END_MESSAGE_MAP(TForm)
라고하면 왼쪽 마우스의 클릭을 잡아내는 핸들러를
갖게 되지요. 그다음은 cpp파일에 핸들러의 코드를 작성합니다.
void __fastcall TForm1::WMLButtonDown(TWMLButtonDown &Msg)
{
SendMessage(Form1->Handle,WM_SYSCOMMAND,SC_MOVE|2,0);
}
이러한 형식으로 써주면 아마 폼은 캡션바가 없더라도
움직이게 되겠지요. 하지만 이 방법의 문제는 왼쪽 클릭
메시지를 받는 대상이 TForm에 한정된다는 것이어서,
폼 위에 올려놓은 다른 컴포넌트를 드래그할 때는 움직이지
않게됩니다.
그래서 또 제가 쓰는 방법은(위 와는 별개의 코드입니다)
TForm의 OnMouseMove이벤트에
ReleaseCapture();
SendMessage(Handle, WM_SYSCOMMAND, SC_MOVE+2, 0);
라고 한 후 각 컴포넌트의 OnMouseMove이벤트를 위에 작성한
TForm의 이벤트에 연결하여 쓰면 됩니다.
그러나 이 것 역시 약점이 있는데 어떤 필요에 의해서 자신의
OnMouseMove이벤트를 기술한 컴포넌트는 연결하기가 조금
곤란하고 복잡해지겠지요.
도움이 되기를 바랍니다.
|