[WinAPI] SetWindowPos

오늘은 SetWindowPos에 대해 알아보겠습니다.

SetWindowPos는 HWND의 (X, Y) 좌표, 가로 세로 길이, 그리고 Z-Order를 변경할 수 있는 함수 입니다.
함수 원형은 아래와 같습니다.

BOOL SetWindowPos(
  HWND hWnd,				// 조작할 핸들
  HWND hWndInsertAfter,		// z순서상 조작할 핸들의 앞에 올 핸들
  int  X,					// x좌표
  int  Y,					// y좌표
  int  cx,					// 가로
  int  cy,					// 세로
  UINT uFlags				// 플래그
);

HWND hWndInsertAfter에는 핸들 혹은 아래 값이 올 수 있습니다.

사용의미
HWND_BOTTOM(HWND) 1Z 순서의 맨 아래에 창을 놓습니다. 는 IF HWND의 매개 변수는 최상위 창을 식별, 창은 맨 위의 지위를 잃고 다른 모든 창 하단에 배치됩니다.
HWND_NOTOPMOST(HWND) -2맨 위가 아닌 모든 창 위에 (즉, 맨 위에있는 모든 창 뒤에) 창을 놓습니다. 윈도우가 이미 최상단이 아닌 윈도우 인 경우에는이 플래그가 적용되지 않습니다.
HWND_TOP(HWND) 0Z 순서의 맨 위에 창을 놓습니다.
HWND_TOPMOST(HWND) -1맨 위가 아닌 모든 창 위에 창을 놓습니다. 창은 비활성화되어 있어도 최상위 위치를 유지합니다.

마지막 인자 UINT uFlags에는 아래 값이 올 수 있습니다.(대표적인 것들만 추렸습니다.)

사용의미
SWP_HIDEWINDOW0x0080창을 숨 깁니다.
SWP_NOACTIVATE0x0010창을 활성화하지 않습니다.
이 플래그를 설정하지 않으면 창이 활성화되고 hWndInsertAfter 매개 변수 의 설정에 따라 최상위 또는 최상위가 아닌 그룹의 맨 위로 이동합니다 .
SWP_NOMOVE0x0002현재 위치를 유지합니다 ( X 및 Y 매개 변수 무시 ).
SWP_NOOWNERZORDER0x0200Z 순서에서 소유자 창의 위치를 변경하지 않습니다.
SWP_NOREDRAW0x0008변경 사항을 다시 그리지 않습니다. 
SWP_NOSIZE0x0001현재 크기를 유지합니다 ( cx 및 cy 매개 변수 무시 ).
SWP_NOZORDER0x0004현재 Z 순서를 유지합니다 ( hWndInsertAfter 매개 변수 는 무시 함 ).
SWP_SHOWWINDOW0x0040창을 표시합니다.

사용 방법은 아래와 같습니다.

::SetWindowPos( hwndTarget, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW );
::SetWindowPos( hwndTarget, hwndAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREDRAW );
::SetWindowPos( hwndTarget, HWND_TOPMOST, 100, 300, 1920, 1080, SWP_NOREDRAW );
::SetWindowPos( hwndTarget, HWND_TOPMOST, 300, 300, 0, 0, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER );

Z-Order의 개념은 여기를 참고해주세요