캡션 외에 다른 곳을 클릭해 윈도우를 이동하려면
윈도우는 마우스 위치를 결정할 필요가 있을 때 윈도우에 WM_NCHITTEST 메시지를 전달합니다.
따라서 마우스가 창의 캡션에 있는 것처럼 인식하도록 윈도우를 속이면 간단히 해결할 수 있습니다.
먼저 클래스위저드를 사용해 WM_NCHITTEST 메시지를 처리하고, 기본 클래스 함수를 호출합니다.
만약 함수가 HTCLIENT를 반환해 마우스가 클라이언트 영역에 있다고 일러주면, 윈도우는 마우스
위치를 캡션으로 인식해 HTCAPTION의 값을 돌려줍니다. 코드는 다음과 같습니다.
UINT CSampleDialog::ONNcHitTest(CPoint point) {
UINT nHitTest = CDialog::OnNcHitTest(point);
return(nHitTest == HTCLIENT)?HTCAPTION : nHitTest;
}
하지만 이 방법은 2가지 단점을 갖고 있습니다. 하지만 클라이언트 영역을 더블클릭할 때 윈도우가
최대화돼 있어야 한다는 것과 뷰를 갖고 있는 프레임 윈도우에서는 허용되지 않는다는 것입니다.
이외에도 사용자가 왼쪽 마우스 단추를 누를 때 감지해 캡션바를 클릭한 것처럼 인식하게 프레임
윈도우를 속이는 방법도 있습니다. 이런 경우 클래스위저드를 사용해 뷰에서 WM_LBUTTONDOWN
메시지를 처리하고, 프레임 윈도우에 단추의 누름 상태를 HTCAPTION으로 지정해 WM_NCBUTTON
메시지를 전달합니다.
void CSampleView::OnLButtonDown(UINT nFlag, CPoint point) {
CView ::OnButtonDown(nFlags, point);
// 사용자가 캡션을 클릭한 것처럼 프레임 윈도우를 속인다.
GetParent()->PostMessage(WM_NCLBUTTONDOWN, HTCAPTION)
}
좀더 응용하면 대화상자와 대화상자 기반의 응용 프로그램에서도 이 방법을 사용할 수 있습니다. 단,
CWnd::GetParent에 대한 호출이 필요하지 않습니다. 다음을 참고하세요.
void CSampleDialog::OnLButtonDown(UINT nFlag, CPoint point) {
CDialog::OnLButtonDown(nFlag, point)
// 사용자가 캡션을 클릭한 것처럼 인식되게 끔 대화상자를 속입니다.
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION,
MAKEPRAM(point.x, point.y));
}