Dialog 크기 조절

예갈조·2024년 12월 4일

Tumor Track Project

목록 보기
3/25

문제


  • 디버깅 시 기존 다이얼로그 크기
  • 다이얼로그 크기를 마음대로 조정할 수 있어서 화면이 잘리는 상황이 발생할 수 있음

→ 다이얼로그 사이즈를 조정하여도 화면이 다 보였으면 좋겠음

  • 사이즈 조절은 가능하되, 비율은 고정시키기
    • 너비와 높이를 특정 비율로 유지하도록 처리해야함
    • WM_SIZE 메시지 처리하기
      • WM_SIZE: 윈도우창의 크기가 변경되고 나서 발생하는 메시지. 호출되는 함수는 OnSize()

방법


  • OnSize() 메시지 사용해도 상관없을 것 같아서 계속 해당 메소드에서 수정 진행
  • OnInitDialog(): 초기 화면 크기 세팅함
    • SetWindowPos() 사용

문제 2


  • 아직 내부 컨트롤 크기 조절 코드 작성 전

  • 무한 크기 재조정

    • SetWindowPos()를 호출하면서 OnSize()가 재귀적으로 호출되었을 가능성
    • 이로 인해 창 크기와 위치가 꼬였을 가능성

SetWindowPos() 재귀 호출 방지

  • 재귀 호출 발생 원인
    • SetWindowPos 함수는 창의 크기와 위치를 변경
    • 이 함수가 호출되면 WM_SIZE 메시지가 다시 발생하며, OnSize가 재차 호출
    • 만약 SetWindowPos 내부에서 변경한 크기와 다시 계산된 크기가 일치하지 않으면, OnSize가 계속 호출되어 무한 재귀 호출이 발생할 수 있음
  • 재귀 방지 플래그 사용
    • isResizing 플래그OnSize가 재귀적으로 호출되지 않도록 제어

    • 재귀 호출을 방지하기 위해, SetWindowPos를 호출하기 전에 isResizing 값을 true로 설정하고, 함수 실행이 끝난 후에는 다시 false로 되돌리기

      // 다이얼로그 비율 고정
      void CTreeCtrlDlg::OnSize(UINT nType, int cx, int cy)
      {
      	static bool isResizing = false; // 재귀 방지 플래그
      	if (isResizing)
      		return;
      
      	CDialogEx::OnSize(nType, cx, cy);
      
      	// 최소화 상태 처리하지 않음
      	if (nType == SIZE_MINIMIZED || cx <= 0 || cy <= 0)
      		return;
      
      	isResizing = true; // 재귀 호출 방지
      
      	// 비율 유지: 너비를 기준으로 높이를 계산
      	int newHeight = static_cast<int>(cx / m_dialogRatio);
      
      	// 크기 조정
      	SetWindowPos(NULL, 0, 0, cx, newHeight, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
      
      	isResizing = false; // 재귀 호출 방지 해제
      }

결과


  • 비율이 고정된 채로 다이얼로그 크기 조절이 가능

추가 구현해야할 것


  1. 내부 컨트롤 사이즈 변경

  2. 기본 다이얼로그의 최소, 최대 사이즈 지정

참고링크

[MFC] Dialog 크기조절 관련 함수,메시지

다이얼로그 사이즈 조절에 따른 내부 컨트롤 처리

0개의 댓글