SetWindowPos 使用注意事项

SetWindowPos 使用注意事项

比起 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:  

你可能感兴趣的:(SetWindowPos 使用注意事项)