比起 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);
个人总结有以下几点要注意
1. 当 SetWindowPos 的 nFlags 参数设置的有 SWP_SHOWWINDOW 或 SWP_HIDEWINDOW 时 设置窗口ZOrder的hWndInsertAfter参数和设置大小位置的x,y,cx,cy无效。这个在msdn中有特别的说明
2.当设置窗口置顶时实际上SetWindowPos 是通过给窗口增加 WS_EX_TOPMOST 扩展样式来实现的。而 WS_EX_TOPMOST 的扩展样式是只能设置到顶层窗口的(top level window)。这意味者对子窗口(具有 ws_child风格)的窗口调用下面的代码是无效的,但悲剧的是这个调用的返回值仍然是 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风格的窗口,可以 通过下面的调用 把hChildWnd置为 hChildWnd的 sibling 窗口的顶层
5: BOOL bRet = ::SetWindowPos(hChildWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
6: