윈도우에서 컨트롤의 크기 조절은 살짝 복잡하다.
내가 계속 MFC를 만지는 것이라면 항상 기억하겠지만 거의 만질일이 없다보니 계속 까먹어서...
정리해둬야지.

크기를 조절하는 데에는 4개의 함수가 쓰인다.

GetWindowRect() : 전제 화면을 기준으로 하는 위치. 즉 모니터의 좌측 상단이 (0,0) 이 된다.
GetClientRect() : 해당 윈도우의 그릴 수 있는 영역(클라이언트 영역이라고 함). 메모장이라면 텍스트를 입력하는 하얀 부분이 되겠다. 하얀 부분의 좌측 상단이 (0,0) 이 된다.
ScreenToClient() : WindowRect를 ClientRect로 바꿔주는 함수
MoveWindow() : 클라이언트 영역 내에서 윈도우(컨트롤)의 위치와 크기를 변경한다.

이 4가지를 이용하여 다음과 같이 컨트롤의 위치와 크기를 변경할 수 있다. 다음은 에디트 박스를 클라이언트 영역의 오른쪽에서 15, 아래에서 15만큼 떨어진 크기를 갖도록 하는 부분으로 OnSize에서 구현된 내용이다.

void CMyFormView::OnSize(UINT nType, int cx, int cy)
{
  CFormView::OnSize(nType, cx, cy);

  // TODO: 여기에 메시지 처리기 코드를 추가합니다.
  if(m_editLog.GetSafeHwnd() != NULL)
  {
    CRect editLogRect; // 에디트 박스의 영역
    m_editLog.GetWindowRect(editLogRect); // 에디트 박스의 스크린 영역을 구함

    // 에디트 박스의 스크린 영역을 CMyFormView 객체의 클라이언트 영역을 기준으로 변경
    ScreenToClient(editLogRect);

    CRect clientRect;
    GetClientRect(clientRect); // CMyFormView 객체의 클라이언트 영역을 구함

    editLogRect.right = clientRect.right - 15; // 클라이언트 영역의 오른쪽에 15픽셀의 공간을 둔다.
    editLogRect.bottom = clientRect.bottom - 15; // 클라이언트 영역의 하단에 15픽셀의 공간을 둔다.

    m_editLog.MoveWindow(editLogRect); // 에디트 박스의 수정된 위치를 적용함
  }
}

이거 보고 이해가 안된다면 별 수 없다.
그림까지 넣어서 설명하면 훨씬 이해가 잘 되겠지만, 지금은 회사라... ㅡ_ㅡ;;

+ Recent posts