윈도우즈에서 사용자에 의해서 차일드 윈도우의 크기나 위치를 실행 시간에 변경하는 일은 매우 힘든 일이다.
하지만 몇가지 윈도우 내부의 마법 메시지 상수를 알게 된다면 더 이상 그러한 일들이 힘든것이 아니란 걸 알게 된다.
여기서 제시되는 것들은 문서화되지 않은 메시지들이지만, 대부분 많이 사용되는 것들이다.
#define SC_SZLEFT (0xF001) // resize from left
#define SC_SZRIGHT (0xF002) // resize from right
#define SC_SZTOP (0xF003) // resize from top
#define SC_SZTOPLEFT (0xF004) // resize from top left
#define SC_SZTOPRIGHT (0xF005) // resize from top right
#define SC_SZBOTTOM (0xF006) // resize from bottom
#define SC_SZBOTTOMLEFT (0xF007) // resize from bottom left
#define SC_SZBOTTOMRIGHT (0xF008) // resize from bottom right
#define SC_DRAGMOVE (0xF012) // move by drag
위에서 정의된 상수들은 WM_SYSCOMMAND의 WPARAM으로 전달될때, 그 진가가 발휘된다.
상수들이 의미하는 바는 위의 주석에 잘 나와있다. 위에서부터 표준 윈도우의 8방향에서 사이즈를 변경하는 것과
마우스 이동시 사용할 수 있는 메시지이다.
그럼 도대체 위 메시지를 윈도우에 전달하면 어떤 일이 일어나는지 살펴보자.
SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
만약 위와 같이 메시지를 보낸다면, hwnd라는 핸들을 가진 윈도우의 위치는 그때부터, 마우스를 드래그 하는 방향으로
변경되게 된다. 윈도우가 자식이건, 자신이건 상관 없다. 단지 메시지를 받은 윈도우는 마우스의 변화에 맞게 저절로
위치가 변경되게 되는 것이다.
이러한 방법은 자식 윈도우의 위치를 제어할때에도 유용하지만, 캡션과 프레임을 없앤 스킨이 들어간 다이알로그를
제어할때에도 유용하게 사용할 수 있다. 제공되는 샘플 소스에는 자식 실행 시간에 8방향에서 사이즈를 변경하는
것과 마우스 드래그에따라 움직이는 Static 윈도우를 보여주고 있다.
//! Static에서 WM_LBUTTONDOWN이 발생했을때 오는 통시 메시지
//! \\param wParam 은 컨트롤 아이디 이다.
//! \\param lParam 은 사용되지 않는다.
LONG CdynresizeDlg::OnMsgStLBDn(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case IDC_MOVE:
ReleaseCapture();
// 드래그하면서 움직이는 메시지를 날린다.
SendMessage(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
break;
case IDC_RESIZERB:
ReleaseCapture();
// 오른쪽 아래를 드래그 하면서 사이즈가 변경되는 메시지를 날린다.
SendMessage(WM_SYSCOMMAND, SC_SZBOTTOMRIGHT, 0);
break;
}
return 0;
}
#define SC_SZLEFT (0xF001)
#define SC_SZRIGHT (0xF002)
#define SC_SZTOP (0xF003)
#define SC_SZTOPLEFT (0xF004)
#define SC_SZTOPRIGHT (0xF005)
#define SC_SZBOTTOM (0xF006)
#define SC_SZBOTTOMLEFT (0xF007)
#define SC_SZBOTTOMRIGHT (0xF008)
#define SC_DRAGMOVE (0xF012)
//! Static에서 WM_LBUTTONDOWN이 발생했을때 오는 통시 메시지
//! \\param wParam 은 컨트롤 아이디 이다.
//! \\param lParam 은 사용되지 않는다.
LONG CdynresizeDlg::OnMsgStLBDn(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case IDC_MOVE:
ReleaseCapture();
// 드래그하면서 움직이는 메시지를 날린다.
SendMessage(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
break;
case IDC_RESIZERB:
ReleaseCapture();
// 오른쪽 아래를 드래그 하면서 사이즈가 변경되는 메시지를 날린다.
SendMessage(WM_SYSCOMMAND, SC_SZBOTTOMRIGHT, 0);
break;
}
return 0;
}
어느 블로그에서 가져온 글인데 출처를 잊어버렸습니다 ^^