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순서를 지정하는 값들이 올 수 있다.

설명
HWND_BOTTOM

hWnd윈도우를 Z순서의 제일 바닥으로 보낸다. 만약 이 윈도우가 항상 위(Top Most)속성을 가지고 있었다면 이 속성은 해제되고 모든 윈도우의 제일 아래쪽에 배치된다.

HWND_NOTOPMOST

항상 위 속성을 가지지 않은 윈도우 중 제일 위쪽에 배치된다. 즉, 항상 위 속성을 가진 윈도우 바로 아래에 배치된다. 이 옵션은 항상 위 속성을 해제할 때 사용된다. 만약 항상 위 옵션을 가지고 있지 않다면 이 옵션은 아무런 효과도 가지지 않는다.

HWND_TOPMOST

항상 위 속성을 설정한다. 항상 위 속성을 가지지 않는 윈도우들보다 위쪽에 배치된다.

HWND_TOP

Z순서상의 제일 위쪽에 배치한다.

▶X,Y : 윈도우의 새로운 좌상단 좌표를 지정한다. 픽셀 단위이다.

▶cx, cy : 윈도우의 새로운 폭과 높이를 지정한다. 픽셀 단위이다.

▶uFlags : 위치와 크기 변경에 대한 여러 가지 옵션들이며 플래그들을 조합하여 지정할 수 있다.

플래그설명
SWP_ASYNCWINDOWPOS

이 함수를 부른 스레드와 윈도우를 소유한 스레드가 다른 입력 큐를 사용할 경우 시스템은 윈도우를 소유한 스레드에게 요구를 포스팅하기만 한다. 이는 호출 스레드가 다른 스레드가 요구를 처리하는 동안 블럭되는 것을 방지한다.

SWP_DEFERERASE

WM_SYNCPAINT 메시지 발생을 금지한다.

SWP_DRAWFRAME

윈도우 주변에 프레임을 그린다.

SWP_FRAMECHANGED

SetWindowLong으로 경계선 스타일을 변경했을 경우 새 스타일을 적용한다. 이 플래그가 지정되면 크기가 변경되지 않아도 WM_NCCALCSIZE 메시지가 전달된다.

SWP_HIDEWINDOW

윈도우를 숨긴다. 이 경우 이동과 크기 변경은 무시된다.

SWP_NOACTIVATE

크기 변경 후 윈도우를 활성화시키지 않는다.

SWP_NOCOPYBITS

이 플래그가 지정되지 않으면 작업영역의 내용이 저장되었다가 크기나 위치변경 후 다시 작업영역으로 복사된다. 이 플래그가 지정되면 이런 저장을 하지 않는다.

SWP_NOMOVE

위치는 이동하지 않고 크기만 변경한다. X,Y인수가 무시된다.

SWP_NOOWNERZORDER

소유자의 Z순서를 변경하지 않는다.

SWP_NOREDRAW

크기, 위치를 바꾼 후 그리기를 하지 않는다. 해당 윈도우는 물론이고 이 윈도우에 의해 다시 드러나는 윈도우도 다시 그리기를 하지 않는다. 이 플래그를 주었을 경우 프로그램은 필요한 부분을 즉시 무효화시켜 다시 그리도록 해 주어야 한다.

SWP_NOREPOSITION

=SWP_NOOWNERZORDER

SWP_NOSENDCHANGING

윈도우에게 WM_WINDOWPOSCHANGING 메시지를 보내지 않는다.

SWP_NOSIZE

크기는 변경하지 않고 위치만 이동한다. cx, cy 인수가 무시된다.

SWP_NOZORDER

현재의 Z순서를 그대로 유지한다. hWndInsertAfter 인수를 무시한다.

SWP_SHOWWINDOW

윈도우를 보인다. 이 경우 이동과 크기 변경은 무시된다.

 

리턴

성공하면 0이 아닌 값을 리턴하며 에러 발생시 0을 리턴한다.

설명

이 함수는 윈도우의 위치, 크기, Z순서를 동시에 또는 일부만 변경할 때 사용된다. 예를 들어 크기는 그대로 두고 위치만 변경하고자 한다거나 위치와 크기는 그대로 두고 Z순서만 변경하고자 할 때 사용한다. MoveWindow 함수는 크기와 위치를 항상 같이 변경하지만 이 함수는 SWP_NOSIZE, SWP_NOMOVE 플래그로 위치와 크기를 개별적으로 변경할 수 있다.

또한 이 함수는 Z순서를 변경하기 위한 목적으로, 특히 항상 위(Top Most) 속성을 토글하기 위한 용도로도 많이 사용되는데 두번째 인수에 HWND_(NO)TOPMOST를 줌으로써 이 속성을 토글할 수 있다. 이 함수로 항상 위 속성을 설정하면 이 윈도우에 소유된 윈도우도 항상 위 속성을 같이 가지게 된다. 그러나 이 윈도우를 소유한 윈도우는 영향을 받지 않는다. 반대로 이 함수로 항상 위 속성을 해제하면 이 윈도우에 소유된 윈도우와 이 윈도우를 소유한 윈도우의 항상 위 속성이 모두 해제된다.

일반적으로 항상 위 속성을 가지지 않은 윈도우가 항상 위 속성을 가진 윈도우를 소유할 수는 있지만 반대는 불가능하다. 왜냐하면 소유된 윈도우는 소유한 윈도우보다 Z순서의 위쪽에 있어야 하므로 소유한 윈도우만 항상 위 옵션을 가질 수는 없기 때문이다. 이렇게 되면 항상 위 옵션을 가지는 윈도우의 차일드로 열려 있는 대화상자가 밑으로 숨어 버리는 현상이 발생할 수 있다. SetWindowPos 함수는 이 모든 처리를 다 해 주므로 항상 위 스타일을 토글 할 때는 SetWindowLong으로 SWL_EXSTYLE을 조작하지 말고 반드시 이 함수를 사용해야 한다.

예제 1 

다음 예제는 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이상

본문참조

 

반응형

+ Recent posts