훈, IT 공부/C,C++,MFC

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

IT훈이 2018. 5. 1.
반응형


 다이얼로그에서 숫자 두개를 입력해서 곱한 값만큼 버튼을 출력하고 버튼은 윈도우의 크기에 따라 커지거나 작아지게 만드는 프로젝트를 하던중 확실하게 알아야할 것 같은 함수들때문에 정리를 해보았습니다. 


OnSize vs OnSizing

void OnSize(UING nType, int cx ,int cy)


WM_SIZE -- 윈도우창의 크기가 변경되고 나서 발생하는 메시징이다. 호출되는 함수로는 OnSize() 가 있다. 크기조절이 완료되고 발생하는 메시지 이기 때문에 실시간 변경은 불가능하다. 


라고 하지만 실제로 사용해보면 실시간으로 WM_SIZE 메시지가 호출된다.... 


void OnSizing(UINT fwSide, LPRECT pRect)


WM_SIZING -- 사용자가 윈도우 창의 크기조절부분에 마우스를 가져다대고 눌러 드래그 하는 순간부터 호출되는 메시지이다.  바로바로 실시간으로 화면을 바꿀수 있다는 것이다.


pRect 값을 조절하면 화면에 자석처럼 붙은 윈도우를 구현할 수 있다.


WM_SIZE 메시지때 호출되는 OnSize(UING nType, int cx, int cy); 함수에서 cx 와 cy 는 누구를 뜻하는지 확인해보면 


GetWindowRect

▨ GetWindowRect 


는 두종류가..?? 있다.


CWnd::GetWindowRect(LPRECT lpRect); 


첫번째는 CWnd의 맴버함수인 경우이다. 호출하면 반환값으로 윈도우 전체에서의 영역을 반환해준다. 

upper-left and lower-right corners. 왼쪽위 오른쪽아래 모서리좌표를 반환한다. 

캡션,테두리,스크롤막대의 키기는 있으면 포함된다.


BOOL WINAPI GetWindowRect(HWND hWnd,LPRECT lpRect);


두번째는 WINAPI 함수이다. 첫번째 인자로 핸들을 넘겨준다. 반환하는 좌표는 직사각형 바깥에 있다. 

실패하면 0을 리턴한다.


MFC에서는 CWnd맴버함수를 사용하면될 것 같다. 알고있으면 잘 사용하지 않을까 싶다.


-------------------------------------------------------------------------------------------------------------------------------

Q&A) GetWindowRect() 작성한 위치에 따라서 값이 달라요.. 왜그렇죠?

 다이얼로그 기반의 프로그램에서 모든 컨트롤이 만들어지면 WM_INITDIALOG가 발생하여 OnInitDialog()메세지 핸들러가 호출된다. 이때 GetWindowRect()함수를 호출하여 윈도우 영역을 구하면 left ,top 의 위치값이 0,0으로 얻어지면서 right , bottom은 윈도우의 너비와 높이로 나오게 된다. 윈도우가 출력되는 위치는 스크린영역의 좌측상단이 아니여도 역시 윈도우의 left , top는 0, 0이 나오게 된다. 

 이런 이유는 윈도우가 처음 생성될 때, 스크린 영역의 좌측 상단에서 생성된 후 윈도우가 출력되어야 하는 위치로 이동하게 되기 때문이다. 


http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=694

▲ 참조


ScreenToClient() vs ClientToScreen()

ScreenToClient()


왼쪽 위 모퉁이 기준으로 새 좌표가 되는 CWnd 클라이언트 영역으로 변환해준다.


void ScreenToClient(LPPOINT lpPoint) const;


클라이언트 뷰 기준으로 좌표를 변환한다.  인자로 CPoint개체 또는 POINT 구조체를 넘겨준다. 


void ScreenToClient(LPRECT lpRect) const;


위와 동일하게 좌표를 반환한다. 인자값이 CRect개체 또는 RECT구초체를 넘겨준다.


ClientToScreen() 


ScreenToClient()의 반대로 생각하면된다. Client기준에서 전체 화면을 기준으로 좌표를 돌려준다.


SetWindowPos()

CWnd::SetWindowPos();


크기, 위치 및 자식, 팝업, 및 최상위 창의 순서를 변경한다.


BOOL SetWindowPos(HWND hWndInserAfter, int x, int y, int cx, int cy, UINT nFlags};


BOOL SetWindowPos(const CWnd* pWndInserAfter, int x, int y, int cx, int cy, UINT nFlags};



x  --- 새 창의 왼쪽 위치를 지정한다.

y  --- 새 창의 위쪽 위치를 지정한다.

cx  --- 창의 새 너비를 지정한다.

cy  --- 창의 새 높이를 지정한다.

nFlags --- 크기 조정 및 위치 지정 옵션.


nFlags 옵션

 - SWP_NOMOVE --- 현재 위치를 유지 ( x, y 매개변수 무시 )

 - SWP_NOSIZE --- 현재 크기 유지 ( cx, cy 매개변수 무시 )


https://msdn.microsoft.com/ko-kr/library/a1yzfz6d.aspx

자세한건 MSDN 참조




반응형

댓글