다이얼로그에서 숫자 두개를 입력해서 곱한 값만큼 버튼을 출력하고 버튼은 윈도우의 크기에 따라 커지거나 작아지게 만드는 프로젝트를 하던중 확실하게 알아야할 것 같은 함수들때문에 정리를 해보았습니다.
● 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 참조
'훈, IT 공부 > C,C++,MFC' 카테고리의 다른 글
[MFC] WM_MOUSEHOVER, WM_MOUSELEAVE 메시지 이용방법 (0) | 2018.05.07 |
---|---|
[MFC]MFC 버튼을 이용한 프로젝트 #1 버튼 추가 + 사이즈조절 (2) | 2018.05.07 |
[MFC] DC, CDC 관련하여 정리 (2) | 2018.05.01 |
[MFC] MFC 실행순서( 생성 ~ 소멸 ) (1) | 2018.04.30 |
[MFC] 각클래스 객체 포인터 얻어오기 (0) | 2018.04.28 |
댓글