캡션 외에 다른 곳을 클릭해 윈도우를 이동하려면

Category:
Author: zemna
Date: April 17, 2021
Share this:

캡션 외에 다른 곳을 클릭해 윈도우를 이동하려면

윈도우는 마우스 위치를 결정할 필요가 있을 때 윈도우에 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));

}

Share this:

Leave a Reply

Your email address will not be published. Required fields are marked *

Let's connect and create
something awesome together!
2023 - Copyright, All Rights Reserved, Made by ZEMNA.NET with ❤️
crossmenu linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram