本文主要介绍了VC中MoveWindow() SetWindowPos()和contact的区别,有需要的朋友可以参考一下。
我在打代码的时候,突然发现有一个背景图显示不出来,很疑惑。最后我发现两个函数MoveWindow() SetWindowPos()使用不当。
这里,分析一下这两个函数的前世。
先看MoveWindow()函数,用来改变窗口的位置和大小。对于顶层窗口,与屏幕左上角对齐;对于子窗口,它与父窗口的左上角对齐。
BOOL MoveWindow( HWND hWnd,int x, int y, int nWidth, int nHeight,BOOL bRepaint = TRUE);
第一个代表窗口句柄;
参数x,y表示窗口左上角的起点;
参数nwidth,nHeight代表窗口的高度和宽度;
最后一个bRepaint表示是否立即重画。如果为真,系统会立即向窗口程序发送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顺序,即当有多个窗口时,这个窗口的显示顺序,顶部还是底部,可选参数有hwnd _ bottom,hwnd _ no top,hwnd _ top。
HWND_BOTTOM:将窗口放在Z顺序的底部。如果参数hWnd标识一个顶级窗口,则该窗口失去其顶级位置,并被放置在其他窗口的底部。
HWND_NOTOPMOST:将窗口置于所有非顶层窗口之上(即所有顶层窗口之后)。如果该窗口已经是非顶层窗口,则此标志无效。
HWND_TOP:将窗口放在Z顺序的顶部。
将窗口放在所有非顶层窗口的顶部。即使窗口没有被激活,窗口也将保持在顶层。
接下来的四个参数是窗口的位置和大小。
最后一个参数nFlags是窗口显示模式的标志。参数有很多,可以组合使用。详情如下:
SWP_ASNCWINDOWPOS:如果调用进程不拥有窗口,系统将向拥有该窗口的线程发出请求。这可以防止调用线程在其他线程处理请求时死锁。
SWP_DEFERERASE:阻止生成WM_SYNCPAINT消息。
SWP _画框:在窗口周围画一个边框(在窗口类描述中定义)。
发送WM_NCCALCSIZE消息到窗口,即使窗口大小没有改变。如果没有指定这个标志,WM_NCCALCSIZE仅在窗口大小改变时发送。
SWP _ HIDEWINDOW;藏起窗户。
SWP_NOACTIVATE:窗口没有被激活。如果未设置该标志,则该窗口被激活并被设置到其他顶层窗口或非顶层组的顶部(根据参数hWndlnsertAfter设置)。
SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置此标志,则在窗口大小更新和重新定位后,客户区的有效内容将被保存并复制回客户区。
SWP_NOMOVE:保持当前位置(忽略x和y参数)。
不要改变所有者窗口在Z轴上的位置。
SWP _诺雷杜:不要画改变的内容。如果设置了该标志,将不会发生重绘操作。适用于客户区和非客户区的所有部分(包括标题栏和滚动条)以及由于窗口向后移动而暴露的任何父窗口。如果设置了此标志,应用程序必须显式地使窗口无效,并重绘窗口的任何部分以及父窗口中需要重绘的部分。
SWP _诺雷森斯;与SWP _诺沃纳佐德旗相同。
阻止窗口接收WM_WINDOWPOSCHANGING消息。
SWP _诺西泽:保持当前大小(忽略cx和Cy参数)。
SWP _诺佐德:保持当前的Z顺序(忽略hWndlnsertAfter参数)。
SWP _显示窗口:显示窗口。
注意事项:
使用SetWindowPos()如果设置了SWP _显示窗口或SWP _隐藏窗口,则窗口不能移动和调整大小。我用的时候设置了SWP_SHOWWINDOW,这样就不可能重画背景了。
两者的比较:
两者都可以移动和改变窗口大小。
MoveWindow()的功能比较简单,只能移动和改变窗口大小,而SetWindowPos()可以设置更多的参数来实现Zorder和显示模式标记。
MoveWindow()向窗口发送WM_WINDOWPOSCHANGING、WM_WINDOWPOSCHANGED、WM_MOVE、WM_SIZE和WM_NCCALCSIZE消息,SetWindowPos()只向窗口发送WM_WINDOWPOSCHANGED消息。所以如果需要发送更多的消息,最好使用MoveWindow()。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。