这篇文章主要介绍了VC++中MoveWindow() SetWindowPos()的区别于联系,需要的朋友可以参考下 敲代码时,突然发现有一个背景图片无法显示,百思不得其解,最终发现是MoveWindow() SetWindowPos()这两个函数的使用不当造成的。 这里把这两个函数的前世今生给分析一下。 先看MoveWindow()函数,用于改变窗口的位置和尺寸,对于顶层窗口,按照屏幕对齐与左上角,对于子窗口,则对齐与父窗口的左上角。 BOOL MoveWindow( HWND hWnd,int x, int y, int nWidth, int nHeight,BOOL bRepaint = TRUE); 第一个表示窗口句柄; 参数x,y表示窗口的左上角起点; 参数nwidth,nHeight 表示窗口高度和宽度; 最后一个bRepaint表示是否立即重绘。为true时系统会立即发送WM_PAINT到窗口程序(会调用UpdateWindow()函数),为false时不会发生任何类型的重绘操作。 MoveWindow会给窗口发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE消息。 接下来看SetWindowPos(),这个函数同样用来实现窗口移动操作,只不过功能更多一点。 BOOL SetWindowPos(HWND hWnd,const CWnd* pWndInsertAfter, int x, int y,int cx, int cy, UINT nFlags); 第一个参数是窗口句柄; 第二个参数是窗口的Z order,就是有多个窗口时,本窗口显示的顺序,最上面或者最下面,可选参数有HWND_BOTTOM,HWND_NOTOPMOST,HWND_TOP,HWND_TOPMOST. HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。 接下来四个参数是窗口的位置和尺寸。 最后一个参数nFlags是窗口显示方式的标志,这个参数很多,可以组合使用,详细如下: SWP_ASNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。 注意事项: 使用SetWindowPos()如果设置了SWP_SHOWWINDOWS或者SWP_HIDEWINDOW,那么窗口将不能被移动和改变大小,我使用时就是设置了SWP_SHOWWINDOW,从而导致不能重绘背景。 两者的比较: 两者都能实现移动和改变窗口大小。 MoveWindow()功能比较单一,只能移动和改变窗口大小,而SetWindowPos()可以设置更多的参数,实现Zorder及显示方式标志。 MoveWindow()发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE等消息到窗口,SetWindowPos()只发送WM_WINDOWPOSCHANGED消息到窗口。所以说如果需要发送更多消息时还是使用MoveWindow()的好。 |