본문 바로가기
프로그래밍

👨‍💻 [MFC] MFC 에서 OnNcCalcSize 이벤트가 호출되는 시점은 언제인가요?

by 밝음의기둥 2025. 4. 15.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

MFC 에서 OnNcCalcSize 이벤트가 호출되는 시점은 언제인지 간략히 알아보았습니다.


질문 >

MFC 에서 OnNcCalcSize 이벤트가 호출되는 시점은 언제인가요?

답변 >

WM_NCCALCSIZE (MFC에서는 OnNcCalcSize) 메시지는 윈도우의 비클라이언트 영역(Non-Client Area) 을 계산할 필요가 있을 때 호출됩니다. 이 메시지는 윈도우의 크기나 모양이 바뀌는 상황에서 클라이언트 영역이 어디까지인지 계산하기 위해 호출되죠.


📌 OnNcCalcSize가 호출되는 시점:

  1. 윈도우가 처음 생성될 때
  2. 윈도우의 크기가 변경될 때 (WM_SIZE 전)
  3. 윈도우의 스타일이 변경될 때
  4. 최소화/최대화/복원될 때
  5. 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


반응형