Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Simple Developer
Simple Developer
캡션 외에 다른 곳을 클릭해 윈도우를 이동하려면
윈도우는 마우스 위치를 결정할 필요가 있을 때 윈도우에 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));
}