,,MoveWindow() SetWindowPos()的区别于联系

,,MoveWindow() SetWindowPos()的区别于联系

本文主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • word文档无法编辑是怎么回事-
  • 华为手机怎么设置返回键(华为手机下面的三个按键设置方法)
  • lumia950怎么样(Lumia950体验分享)
  • otg连接是什么意思(OTG连接手机方法)
  • 笔记本触摸板怎么右键(笔记本电脑触控板手势操作设置)
  • 真我x7怎么样(realme X7 系列体验)
  • 苹果的A16处理器有多强(苹果的A16处理器的介绍)
  • 小米互传怎么用(小米手机的连接与共享教程)
  • 怎么设置电脑桌面图标自动对齐 设置电脑桌面自动整理图标的方法
  • 宽带错误651最简单解决方法(处理宽带错误651的措施)
  • 大学生手机有什么推荐(大学生换手机攻略)
  • 天玑1100和骁龙778g哪个好(骁龙778G、天玑900、天玑1100购选建议)
  • yum update 升级报错的解决办法
  • Windows10禁用屏保教程
  • 连接wifi显示无互联网连接怎么办(无线连上了却不能上网处理绝招)
  • 留言与评论(共有 条评论)
       
    验证码: