WM_NCCALCSIZE
메시지는 일반적으로 Windows 운영 체제가 창의 비클라이언트 영역을 다시 계산해야 할 때 자동으로 트리거됩니다. 이 메시지는 창의 크기, 위치 또는 비클라이언트 영역에 영향을 미치는 다른 요인에 변경 사항이 있을 때 전송됩니다.
다음은 WM_NCCALCSIZE
를 트리거하는 몇 가지 시나리오입니다.
- 창 크기 조정:
- 사용자가 창 테두리를 끌거나 창을 최대화하거나 복원하는 등 창 크기를 조정할 때
WM_NCCALCSIZE
가 트리거됩니다.
- 사용자가 창 테두리를 끌거나 창을 최대화하거나 복원하는 등 창 크기를 조정할 때
- 창 생성:
- 창이 초기에 생성될 때는
WM_NCCALCSIZE
메시지가 초기 비클라이언트 영역의 크기를 계산하기 위해 전송됩니다.
- 창이 초기에 생성될 때는
- 창 이동:
- 창을 이동하면 비클라이언트 영역을 다시 계산해야 할 수 있으며
WM_NCCALCSIZE
가 전송됩니다.
- 창을 이동하면 비클라이언트 영역을 다시 계산해야 할 수 있으며
- 창 스타일 변경:
- 일부 창 스타일을 변경하면 비클라이언트 영역의 다시 계산이 필요할 수 있습니다.
WM_NCCALCSIZE
메시지를 MFC 응용 프로그램에서 처리하려면 이전 예제에서 설명한 대로 CWnd
파생 클래스에서 OnNcCalcSize
함수를 오버라이드하면 됩니다.
특정 창에 대해 WM_NCCALCSIZE
를 수동으로 트리거하려면 SetWindowPos
함수를 사용할 수 있습니다. 간단한 예는 다음과 같습니다.
NC영역을 새로 계산하도록 WM_NCCALCSIZE 메시지 발생 시키기
// WM_NCCALCSIZE를 수동으로 트리거하기
// hwnd는 창에 대한 핸들로 가정합니다.
HWND hwnd = /* ... */;
// SetWindowPos를 사용하여 WM_NCCALCSIZE 트리거
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED);
이 코드는 SWP_FRAMECHANGED
플래그를 사용하여 SetWindowPos
를 호출하며, 이는 프레임이 변경되었음을 나타냅니다(비클라이언트 영역). 이것은 WM_NCCALCSIZE
메시지를 트리거할 수 있습니다.
기억하세요. WM_NCCALCSIZE
를 수동으로 트리거할 수는 있지만 창의 상태 변경에 자동으로 시스템이 대응하도록 하는 것이 일반적으로 더 좋습니다.