콘텐츠로 건너뛰기

Non-Client 영역을 새로 계산하도록 하기 (WM_NCCALCSIZE 발생)

WM_NCCALCSIZE 메시지는 일반적으로 Windows 운영 체제가 창의 비클라이언트 영역을 다시 계산해야 할 때 자동으로 트리거됩니다. 이 메시지는 창의 크기, 위치 또는 비클라이언트 영역에 영향을 미치는 다른 요인에 변경 사항이 있을 때 전송됩니다.

다음은 WM_NCCALCSIZE를 트리거하는 몇 가지 시나리오입니다.

  1. 창 크기 조정:
    • 사용자가 창 테두리를 끌거나 창을 최대화하거나 복원하는 등 창 크기를 조정할 때 WM_NCCALCSIZE가 트리거됩니다.
  2. 창 생성:
    • 창이 초기에 생성될 때는 WM_NCCALCSIZE 메시지가 초기 비클라이언트 영역의 크기를 계산하기 위해 전송됩니다.
  3. 창 이동:
    • 창을 이동하면 비클라이언트 영역을 다시 계산해야 할 수 있으며 WM_NCCALCSIZE가 전송됩니다.
  4. 창 스타일 변경:
    • 일부 창 스타일을 변경하면 비클라이언트 영역의 다시 계산이 필요할 수 있습니다.

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를 수동으로 트리거할 수는 있지만 창의 상태 변경에 자동으로 시스템이 대응하도록 하는 것이 일반적으로 더 좋습니다.

태그:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다