티스토리 뷰

개발/VC++ (MFC)

MFC : 윈도우(창) 좌표 이야기

부캐: 개발하는 조대리 2023. 5. 22. 09:00
반응형

MFC(VC++) 윈도우(창) 좌표 이야기

윈도우(창)의 자식 창이 있을 경우 이 자식 창의 좌표를 얻는 방법은 2가지가 있습니다.

 

1. 자식 창의 윈도우 핸들을 얻어 그 핸들을 사용해서 GetClientRect() 함수를 사용하는 방법

GetClientRect() 함수는 자식 창의 클라이언트 영역의 좌표를 얻는 데 사용되며, 이는 자식 창의 캡션과 테두리를 제외한 영역입니다.

CRect r;
// 'IDOK' 버튼을 제어할 수 있는 CWnd 객체의 주소를 얻는다.
CWnd *p_ok_btn = GetDlgItem(IDOK);
if (NULL != p_ok_btn) {
    // '확인' 버튼의 클라이언트 영역 좌표를 구한다.
    p_ok_btn->GetClientRect(r);
}

 

2. 먼저 GetWindowRect() 함수를 통해 화면 전체 기준의 좌표를 얻고 그다음 ScreenToClient() 함수를 사용하는 방법

GetWindowRect() 함수에서 얻은 좌표는 클라이언트 영역의 좌표가 아니므로 ScreenToClient() 함수를 호출하여 화면 좌표를 클라이언트 영역 좌표로 변환해야 합니다.

CRect r;
// 'IDOK' 버튼을 제어할 수 있는 CWnd 객체의 주소를 얻는다.
CWnd *p_ok_btn = GetDlgItem(IDOK);
if (NULL != p_ok_btn) {
    // '확인' 버튼의 윈도우 영역 좌표를 구한다.
    p_ok_btn->GetWindowRect(r);
    // '확인' 버튼의 윈도우 영역 좌표를 클라이언트 영역 좌표로 변환한다.
    ScreenToClient(r);
}

 

여기서 중요한 차이점이 있습니다. 그냥 지나칠 수도 있지만 알고 있으면 도움이 될 것이라 생각합니다.

문제의 차이점은 GetClientRect() 함수는 자식 창의 클라이언트 영역의 좌표를 얻는 반면, GetWindowRect() 함수에서 얻은 좌표는 자식 창의 윈도우 영역의 좌표입니다. 자식 창의 윈도우 영역은 캡션, 테두리, 메뉴 막대와 같은 자식 창의 모든 부분을 포함하는 영역이고, 자식 창의 클라이언트 영역은 캡션, 테두리, 메뉴 막대와 같은 자식 창의 모든 부분을 제외한 영역입니다.


개인적으로 학습하면서 정리한 내용입니다.

잘못된 내용이 있으면 알려주세요. 확인 후 수정 및 반영하도록 하겠습니다.

 

오늘도 감사합니다.(__)>