比起 MoveWindow,SetWindowPos 可以同時(shí)改變窗口的大小和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);
個(gè)人總結(jié)有以下幾點(diǎn)要注意
1. 當(dāng) SetWindowPos 的 nFlags 參數(shù)設(shè)置的有 SWP_SHOWWINDOW 或 SWP_HIDEWINDOW 時(shí) 設(shè)置窗口ZOrder的hWndInsertAfter參數(shù)和設(shè)置大小位置的x,y,cx,cy無效。這個(gè)在msdn中有特別的說明
2.當(dāng)設(shè)置窗口置頂時(shí)實(shí)際上SetWindowPos 是通過給窗口增加 WS_EX_TOPMOST 擴(kuò)展樣式來實(shí)現(xiàn)的。而 WS_EX_TOPMOST 的擴(kuò)展樣式是只能設(shè)置到頂層窗口的(top level window)。這意味者對子窗口(具有 ws_child風(fēng)格)的窗口調(diào)用下面的代碼是無效的,但悲劇的是這個(gè)調(diào)用的返回值仍然是 true。
1: //hChildWnd 是具有 WS_CHILD風(fēng)格的窗口 ,下面的操作無效
2: BOOL bRet = ::SetWindowPos(hChildWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
3:
4: //hChildWnd 是具有 WS_CHILD風(fēng)格的窗口,可以 通過下面的調(diào)用 把hChildWnd置為 hChildWnd的 sibling 窗口的頂層
5: BOOL bRet = ::SetWindowPos(hChildWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
6: