比起 MoveWindow,SetWindowPos 可以同時改變窗口的大小和ZOrder。但是它的使用沒有MoveWindow那么直觀。api 原型如下
1: WINUSERAPI
2: BOOL
3: WINAPI
4: SetWindowPos(
5: __in HWND hWnd,
6: __in_opt HWND hWndInsertAfter,
7: __in int X,
8: __in int Y,
9: __in int cx,
10: __in int cy,
11: __in UINT uFlags);
個人總結(jié)有以下幾點要注意
1. 當 SetWindowPos 的 nFlags 參數(shù)設(shè)置的有 SWP_SHOWWINDOW 或 SWP_HIDEWINDOW 時 設(shè)置窗口ZOrder的hWndInsertAfter參數(shù)和設(shè)置大小位置的x,y,cx,cy無效。這個在msdn中有特別的說明
2.當設(shè)置窗口置頂時實際上SetWindowPos 是通過給窗口增加 WS_EX_TOPMOST 擴展樣式來實現(xiàn)的。而 WS_EX_TOPMOST 的擴展樣式是只能設(shè)置到頂層窗口的(top level window)。這意味者對子窗口(具有 ws_child風格)的窗口調(diào)用下面的代碼是無效的,但悲劇的是這個調(diào)用的返回值仍然是 true。
1: //hChildWnd 是具有 WS_CHILD風格的窗口 ,下面的操作無效
2: BOOL bRet = ::SetWindowPos(hChildWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
3:
4: //hChildWnd 是具有 WS_CHILD風格的窗口,可以 通過下面的調(diào)用 把hChildWnd置為 hChildWnd的 sibling 窗口的頂層
5: BOOL bRet = ::SetWindowPos(hChildWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
6: