반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
MFC 에서 OnNcCalcSize 이벤트가 호출되는 시점은 언제인지 간략히 알아보았습니다.
질문 >
MFC 에서 OnNcCalcSize 이벤트가 호출되는 시점은 언제인가요?
답변 >
WM_NCCALCSIZE (MFC에서는 OnNcCalcSize) 메시지는 윈도우의 비클라이언트 영역(Non-Client Area) 을 계산할 필요가 있을 때 호출됩니다. 이 메시지는 윈도우의 크기나 모양이 바뀌는 상황에서 클라이언트 영역이 어디까지인지 계산하기 위해 호출되죠.
📌 OnNcCalcSize가 호출되는 시점:
- 윈도우가 처음 생성될 때
- 윈도우의 크기가 변경될 때 (WM_SIZE 전)
- 윈도우의 스타일이 변경될 때
- 최소화/최대화/복원될 때
- DPI 변경 등의 시스템 스케일 변경 시
📌 함수 시그니처
afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
- bCalcValidRects:
- TRUE이면 윈도우가 리사이즈되고 있다는 뜻 (NCCALCSIZE_PARAMS 구조 사용)
- FALSE이면 lpncsp는 단순한 RECT* 포인터로 사용됨
- lpncsp: 클라이언트 영역 좌표를 담은 구조체로, 이 값을 조정하면 클라이언트 영역의 위치/크기를 직접 제어할 수 있습니다.
🧠 이 메시지를 사용하는 대표적 목적:
- 커스텀 테두리/타이틀바 구현 (예: 창의 제목 표시줄을 없애거나 직접 그릴 때)
- 클라이언트 영역 확대 (전체창을 클라이언트처럼 보이게 할 때)
- 프레임 없는 윈도우 (frameless window) 만들기
🧪 예시: 타이틀바 없애고 클라이언트 영역을 전체로 확장
void CMyWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
// 클라이언트 영역을 전체 윈도우 크기로 확장
if (bCalcValidRects)
{
lpncsp->rgrc[0] = lpncsp->rgrc[1]; // 이전 영역 유지
}
else
{
// 단순 RECT 포인터
LPRECT rcClient = (LPRECT)lpncsp;
// 여기서 rcClient를 수정해도 됨
}
CWnd::OnNcCalcSize(bCalcValidRects, lpncsp); // 기본 동작 호출
}
⚠️ OnNcCalcSize를 사용하면 윈도우의 기본 프레임 처리를 우회하게 되므로, 창 크기 조절, 이동, 그림자 같은 처리도 수동으로 구현해야 할 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [C++] C++ 에서 현재 날짜로 부터 몇일 차이가 나는 날짜를 구하려면 어떻게 해야 하나요? (2) | 2025.04.29 |
---|---|
👨💻 [C++] C++ 에서 gmtime 함수는 무엇인가요? (0) | 2025.04.29 |
👨💻 [MFC] MFC 에서 윈도우가 생성될 때 호출되는 OnSize에 전달되는 cx, cy 값은 무엇을 기준으로 전달되나요? (0) | 2025.04.15 |
👨💻 [MFC] MFC 에서 이미지 파일이 깨졌는지 확인하려면 어떻게 해야 하나요? (0) | 2025.03.27 |
👨💻 [MFC] MFC 의 COleDateTime 에서 특정 날짜를 빼려면 어떻게 해야 하나요? (0) | 2025.03.22 |