C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[2663] Re:캡션없는 폼의 드래그
박지훈.임프 [cbuilder] 4417 읽음    2000-01-11 00:00
: 전문가들이 보기에는 쉬운 문제지요.
: 폼의 boder style을 None으로 바꾸었어도
: 폼을 움직일 수 있게 하는 방법을 가르쳐 주세요.
:
: 델파이에서는 하는 방법을 겨우 알았는데 빌더로 바꾸기가 어렵군요.
:
: 여기서 쓰는 방법을 자세히 가르쳐 주세요.
: 그럼 정말 고맙겠습니다.
:
:


임펠리테리입니다.

물론 아래 정진후님의 방법도 맞습니다. WM_SYSCOMMAND는 윈도우를 드래그해서 이동시키거나
사이즈를 바꿀때 쓰일 수 있습니다. 하지만 폼의 메시지 처리를 좀 더 깊이 파보면, WM_SYSCOMMAND
메시지 외에도 좀더 색다르면서도 원론적인 방법이 있다는 것을 알 수 있습니다.

먼저 윈도우의 영역의 분류부터 알아보면.. 윈도우의 영역은 크게 클라이언트 영역(컨트롤을 올려
놓거나 그림같은 것을 맘대로 그릴 수 있는, 말그대로 윈도우의 안쪽 영역)과 넌-클라이언트 영역
으로 나눌 수 있는데, 넌-클라이언트 영역에는 캡션바와 윈도우경계 부분, 그리고 폼 자체의
스크롤바 등이 있습니다.

마우스로 윈도우의 어떤 부분을 클릭했을 때, 윈도우 시스템은 어떻게 윈도우의 캡션바와 같은
넌-클라이언트 영역과 클라이언트 영역을 구분할까요? 뭐, 캡션바 영역이니까 캡션으로 인식하는
거지! 하고 간단히 생각해버릴 수도 있습니다만, 윈도우 메시지 처리 메커니즘에서는 이러한
판단조차도 그 윈도우가 속한 프로그램을 작성한 프로그래머의 판단에 의해 결정할 수 있게 되어
있습니다.

이러한 역할을 하는 것이 WM_NCHITTEST 메시지입니다. 이 메시지에 대한 핸들러는 일종의 콜백
함수와 같은 역할을 합니다. 윈도우의 한 부분이 마우스로 클릭되면 그 윈도우는 WM_LBUTTONDOWN
이나 WM_RBUTTONDOWN 메시지 외에도 이 메시지를 추가로 받습니다.

이 메시지의 역할은 클릭된 해당 부분에 대한 프로그램 자체의 판단값을 리턴받는 것입니다.
클릭한 X, Y 좌표를 넘겨주고는 그 좌표가 어떤 영역인지를 돌려받기를 기다리는 거죠.
TForm에는 기본적으로 이 메시지에 대한 핸들러가 포함되어 있습니다. 그래서 추가적인 코딩이
없이도 폼 자체로서 자신의 각 영역에 대한 판단을 할 수 있습니다. 캡션바를 드래그해서 이동시킨
다든지, 경계부분을 드래그해서 리사이즈하는 간단한 동작조차도 이정도의 처리가 미리 되어있기
때문에 가능한 것입니다.

다시 말하면.. 이 메시지에 대한 핸들러를 다시 작성하고, 윈도우 시스템이 속도록 영역에 대한
판단을 가짜로 돌려보내면 "여기는 캡션이라고 믿어!" 라고 우겨버릴 수 있는 셈입니다.
질문하신 것과 같이, 폼의 클라이언트 영역을 드래그해서 폼을 이동시키려면 클릭된 위치가
클라이언트 영역일 때 캡션바인 것처럼 속여주면 되겠지요?

이와 같은 이론에 따라.. 코드를 작성하면 다음과 같이 됩니다.

class TForm1 : public TForm
{
...
private:
    virtual void __fastcall WMNCHitTest(TWMNCHitTest &Message);

BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest)
END_MESSAGE_MAP(TForm)
};

void __fastcall TForm1::WMNCHitTest(TWMNCHitTest &Message)
{
    TForm::Dispatch(&Message);
    if(Message.Result == HTCLIENT)
        Message.Result = HTCAPTION;
}

그럼 참고하시길...

+ -

관련 글 리스트
2661 쉬운거지만 나만 모르는거시야요.. 초보 빌더 사용자 3931 2000/01/11
2663     Re:캡션없는 폼의 드래그 박지훈.임프 4417 2000/01/11
2662     Re:쉬운거지만 나만 모르는거시야요.. 정진후 4226 2000/01/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.