http://www.winapi.co.kr
SetWindowPos
원형 | BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags); | ||||||||||||||||||||||||||||||||||||||||||
인수 | ▶ hWnd : 이동 대상 윈도우의 핸들 ▶ hWndInsertAfter : 윈도우의 Z순서를 지정한다. 이 인수가 지정하는 윈도우 앞에 hWnd가 배치되는데 단 hWnd가 액티브 상태일 경우 이 인수가 지정하는 윈도우 핸들은 무시된다. 또는 다음과 같이 Z순서를 지정하는 값들이 올 수 있다.
▶X,Y : 윈도우의 새로운 좌상단 좌표를 지정한다. 픽셀 단위이다. ▶cx, cy : 윈도우의 새로운 폭과 높이를 지정한다. 픽셀 단위이다. ▶uFlags : 위치와 크기 변경에 대한 여러 가지 옵션들이며 플래그들을 조합하여 지정할 수 있다.
| ||||||||||||||||||||||||||||||||||||||||||
리턴 | 성공하면 0이 아닌 값을 리턴하며 에러 발생시 0을 리턴한다. | ||||||||||||||||||||||||||||||||||||||||||
설명 | 이 함수는 윈도우의 위치, 크기, Z순서를 동시에 또는 일부만 변경할 때 사용된다. 예를 들어 크기는 그대로 두고 위치만 변경하고자 한다거나 위치와 크기는 그대로 두고 Z순서만 변경하고자 할 때 사용한다. MoveWindow 함수는 크기와 위치를 항상 같이 변경하지만 이 함수는 SWP_NOSIZE, SWP_NOMOVE 플래그로 위치와 크기를 개별적으로 변경할 수 있다. 또한 이 함수는 Z순서를 변경하기 위한 목적으로, 특히 항상 위(Top Most) 속성을 토글하기 위한 용도로도 많이 사용되는데 두번째 인수에 HWND_(NO)TOPMOST를 줌으로써 이 속성을 토글할 수 있다. 이 함수로 항상 위 속성을 설정하면 이 윈도우에 소유된 윈도우도 항상 위 속성을 같이 가지게 된다. 그러나 이 윈도우를 소유한 윈도우는 영향을 받지 않는다. 반대로 이 함수로 항상 위 속성을 해제하면 이 윈도우에 소유된 윈도우와 이 윈도우를 소유한 윈도우의 항상 위 속성이 모두 해제된다. 일반적으로 항상 위 속성을 가지지 않은 윈도우가 항상 위 속성을 가진 윈도우를 소유할 수는 있지만 반대는 불가능하다. 왜냐하면 소유된 윈도우는 소유한 윈도우보다 Z순서의 위쪽에 있어야 하므로 소유한 윈도우만 항상 위 옵션을 가질 수는 없기 때문이다. 이렇게 되면 항상 위 옵션을 가지는 윈도우의 차일드로 열려 있는 대화상자가 밑으로 숨어 버리는 현상이 발생할 수 있다. SetWindowPos 함수는 이 모든 처리를 다 해 주므로 항상 위 스타일을 토글 할 때는 SetWindowLong으로 SWL_EXSTYLE을 조작하지 말고 반드시 이 함수를 사용해야 한다. 다음 예제는 SetWindowPos 함수로 윈도우의 위치만 변경하는 방법과 항상 위 스타일을 토글하는 방법을 보여준다. LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; char Mes[]="왼쪽=위치 변경, 오른쪽=항상 위 옵션 변경"; static BOOL bTopMost=FALSE; switch(iMessage) { case WM_LBUTTONDOWN: SetWindowPos(hWnd, HWND_NOTOPMOST, rand()%640, rand()%480, 0, 0, SWP_NOSIZE); return 0; case WM_RBUTTONDOWN: if (bTopMost) { SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); } else { SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); } bTopMost=~bTopMost; return 0; case WM_PAINT: hdc=BeginPaint(hWnd, &ps); TextOut(hdc,10,10,Mes,lstrlen(Mes)); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } 왼쪽 버튼을 누르면 난수로 정한 새 위치로 윈도우를 옮기되 SWP_NOSIZE 플래그를 주어 크기는 변경하지 않도록 하였다. 오른쪽 버튼을 누르면 항상 위 옵션을 토글시킨다. | ||||||||||||||||||||||||||||||||||||||||||
참고함수 | MoveWindow : 윈도우의 위치와 크기를 동시에 변경한다. | ||||||||||||||||||||||||||||||||||||||||||
플렛폼 | 95이상 | ||||||||||||||||||||||||||||||||||||||||||
본문참조 |
|
'프로그래밍(Programming) > MFC&API' 카테고리의 다른 글
ShowWindow, 윈도우 숨기기(안보이게) (0) | 2012.11.01 |
---|---|
윈도우 실행시 작업 표시줄에 해당 윈도우 숨기자!! (0) | 2012.11.01 |
윈도우클래스 이름 등록 lpszClass (0) | 2012.11.01 |
API 상에서 콘솔 띄우기 (0) | 2012.11.01 |
MFC & win32 에서 콘솔창 띄우기 (0) | 2012.11.01 |