MoveWindow and SetWindowPos
转自:http://blog.sina.com.cn/s/blog_82c346de0100u7kq.html
MoveWindow仅仅能设置窗体的大小和位置;SetWindowPos拥有MoveWindow的所有功能之外。还能够设置窗体的层叠关系(如。把指定的窗体放在所有窗体的最上层--always on top就能够用这个函数、或者把指定的窗体放在还有一个窗体的下层。等等)。
没有什么优缺点可言,仅仅是功能上的大小有别。
你全然能够不用MoveWindow,而仅仅用SetWindowPos;可是。在仅仅要设置窗体大小或位置的情况下,你也全然能够使用MoveWindow.
void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );
參数
x指定了CWnd的左边的新位置。
y指定了CWnd的顶部的新位置。
nWidth指定了CWnd的新宽度。
nHeight指定了CWnd的新高度。
bRepaint指定了是否要重画CWnd。
假设为TRUE,则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。假设这个參数为FALSE。则不会发生不论什么类型的重画操作。这应用于客户区、非客户区(包含标题条和滚动栏)和因为CWnd移动而露出的父窗体的不论什么部分。当这个參数为FALSE的时候,应用程序必须明白地使CWnd和父窗体中必须重画的部分无效或重画。lpRectCRect对象或RECT结构,指定了新的大小和位置。说明这个函数改变窗体的位置和大小。对于顶层的CWnd对象,x和y參数是相对于屏幕的左上角的。对于子对象。它们是相对于父窗体客户区的左上角的。
MoveWindow函数发送一条WM_GETMINMAXINFO消息。处理这个消息时,CWnd得到一个改变最大和最小的窗体缺省值的机会。假设传递给MoveWindow成员函数的參数超过了这些值。则在WM_GETMINMAXINFO处理函数中能够用最小或最大值来取代这些值。
BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy,UINT nFlags );
返回值假设函数成功,则返回非零值。否则返回0。
參数pWndInsertAfter标识了在Z轴次序上位于这个CWnd对象之前的CWnd对象。这个參数能够是指向CWnd对象的指针。也能够是指向下列值的指针:l wndBottom 将窗体放在Z轴次序的底部。假设这个CWnd是一个顶层窗体,则窗体将失去它的顶层状态;系统将这个窗体放在其他全部窗体的底部。
l wndTop 将窗体放在Z轴次序的顶部。l wndTopMost 将窗体放在全部非顶层窗体的上面。这个窗体将保持它的顶层位置,即使它失去了活动状态。wndNoTopMost 将窗体又一次定位到全部非顶层窗体的顶部(这意味着在全部的顶层窗体之下)。
这个标志对那些已经是非顶层窗体的窗体没有作用。有关这个函数以及这些參数的使用规则參见说明部分。x指定了窗体左边的新位置。y指定了窗体顶部的新位置。cx指定了窗体的新宽度。
cy指定了窗体的新高度。nFlags指定了大小和位置选项。
这个參数能够是下列值的组合:l SWP_DRAWFRAME 环绕窗体画出边框(在创建窗体的时候定义)。
l SWP_FRAMECHANGED 向窗体发送一条WM_NCCALCSIZE消息,即使窗体的大小不会改变。假设没有指定这个标志,则仅当窗体的大小发生变化时才发送WM_NCCALCSIZE消息。l SWP_HIDEWINDOW 隐藏窗体。SWP_NOACTIVATE 不激活窗体。假设没有设置这个标志。则窗体将被激活并移动到顶层或非顶层窗体组(依赖于pWndInsertAfter參数的设置)的顶部。l SWP_NOCOPYBITS 废弃这个客户区的内容。假设没有指定这个參数,则客户区的有效内容将被保存,并在窗体的大小或位置改变以后被拷贝回客户区。l SWP_NOMOVE 保持当前的位置(忽略x和y參数)。
l SWP_NOOWNERZORDER 不改变拥有者窗体在Z轴次序上的位置。l SWP_NOREDRAW 不重画变化。假设设置了这个标志,则不发生不论什么种类的变化。
这适用于客户区、非客户区(包含标题和滚动栏)以及被移动窗体覆盖的父窗体的不论什么部分。当这个标志被设置的时候。应用程序必须明白地无效或重画要重画的窗体和父窗体的不论什么部分。
l SWP_NOREPOSITION 与SWP_NOOWNERZORDER同样。l SWP_NOSENDCHANGING 防止窗体接收WM_WINDOWPOSCHANGING消息。l SWP_NOSIZE 保持当前的大小(忽略cx和cy參数)。l SWP_NOZORDER 保持当前的次序(忽略pWndInsertAfter)。
l SWP_SHOWWINDOW 显示窗体。
调用这个成员函数以改变子窗体、弹出窗体和顶层窗体的大小、位置和Z轴次序。
窗体在屏幕上依照它们的Z轴次序排序。在Z轴次序上处于顶端的窗体将程序在全部其他窗体的顶部。
子窗体的全部坐标都是客户坐标(相对于父窗体客户区的左上角)。窗体能够被移动到Z轴次序的顶部,既能够通过将pWndInsertAfter參数设为&wndTopMost,并确保没有设置SWP_NOZORDER标志。也能够通过设置窗体的Z轴次序使它位于全部现存的顶层窗体上方。当一个非顶层窗体被设为顶层窗体时。它拥有的窗体也被设为顶层的。它的拥有者不发生变化。
假设顶层窗体被又一次定位到Z轴次序的底部(&wndBottom)或不论什么非顶层窗体之后。则它将不再是顶层窗体。
当顶层窗体被变为非顶层窗体时。它全部的拥有者和它拥有的全部窗体都被变为非顶层窗体。假设既没有指定SWP_NOACTIVE标志也没有指定SWP_NOZORDER标志(这意味着应用程序要求窗体被同一时候激活并放入指定的Z轴次序),则pWndInsertAfter參数中指定的值将仅仅在下列环境下适用:l 在pWndInsertAfter參数中既没有指定&wndTopMost也没有指定&wndNoTopMost。
这个窗体不是活动窗体。应用程序不能激活一个非活动窗体但同一时候又不把它带到Z轴次序的顶部。
应用程序能够没有不论什么限制地改变活动窗体的Z轴次序。非顶层窗体可能拥有一个顶层窗体,可是反之则不成立。不论什么被顶层窗体拥有的窗体(比如对话框)都将自己变为顶层窗体。以确保全部被拥有的窗体位于它们的拥有者上方。
在Windows 3.1或更新的版本号中。能够将窗体移动到Z轴次序的顶部,并通过设置它们的WS_EX_TOPMOST风格而将之锁定在那里。这样的顶层窗体即使在失去活动状态以后也会保持顶层位置。比如,选择WinHelp的Always On Top命令会使帮助窗体变为顶层,而且在你返回应用程序之后它还保持可见。要创建一个顶层窗体。应在调用SetWindowPos的时候将pWndInsertAfter參数设为&wndTopMost,或者在创建窗体的时候设置WS_EX_TOPMOST风格。假设Z轴次序中包括了不论什么具有WS_EX_TOPMOST风格的窗体,则用&wndTopMost移动的窗体将被放到全部非顶层窗体的顶部,可是位于不论什么顶层窗体的以下。当应用程序激活一个不具有WS_EX_TOPMOST风格的非活动窗体时,该窗体将被移动到全部非顶层窗体的上方,可是位于全部顶层窗体的下方。假设在调用SetWindowPos的时候pWndInsertAfter參数被设为&wndBottom。而且CWnd是一个顶层窗体。则该窗体失去顶层状态(WS_EX_BOTTOM风格被清除),而且系统将窗体放在Z轴次序的底部。
MoveWindow
|
函数功能:该函数改变指定窗体的位置和尺寸。 对于顶层窗体,位置和尺寸是相对于屏幕的左上角的:对于子窗体。位置和尺寸是相对于父窗体客户区的左上角坐标的。 函数原型:BOOL MoveWindow(HWND hWnd.int x.int y,int nWidth,int nHeight,BOOL BRePaint)。 x:指定窗体的新位置的左边界。 nWidth:指定窗体的新的宽度。 它适用于客户区。非客户区(包含标题栏和滚动栏)。及因为移动子窗体而露出的父窗体的区域。假设參数为FALSE,应用程序就必须明白地使窗体无效或重画该窗体和须要刷新的父窗体。 返回值:假设函数成功,返回值为非零;假设函数失败。返回值为零。若想获得很多其它错误信息。请调用GetLastError函数。 我收集和学习别人的文章,我对这些文章的作者或译者表示感谢 改变控件的大小和位置 用CWnd类的函数MoveWindow()或SetWindowPos()能够改变控件的大小和位置。 void MoveWindow(int x,int y,int nWidth,int nHeight); SetWindowPos()函数使用更灵活,多用于仅仅改动控件位置而大小不变或仅仅改动大小而位置不变的情况: |
MoveWindow and SetWindowPos的更多相关文章
- MoveWindow和SetWindowPos
SetWindowPos即使里面使用的是一样的矩形参数,有时候SetWindowPos还是会改变窗口的大小,真是坑爹!!! MoveWindow就不会改变 mark一下
- (转载)解决GDI闪烁
一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁. 先来谈谈闪烁产生的原因 原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的 ...
- Client Window坐标 RECT相关函数
GetClientRect(HWND, RECT*) ---得到窗口的客户区大小,left,top总是0,bottom是客户区高度,right是客户区宽度 GetWindowRect(HWND, RE ...
- vc++ mfc中拖动效果的实现 借助于CImageList
拖动是界面编程频繁使用的一个效果,在windows系统下可谓大行其道.纵观时下的应用软件几乎各个都支持各种各样拖动的效果,windows7更是把拖动做到了极致.其实说起来拖动的实现也很简单,对于有句柄 ...
- (VC)解决绘图时闪烁问题的一点经验[转]
转自:http://www.cnblogs.com/lidabo/p/3429862.html 清除屏幕闪烁 (转自网上) <一> 由于作图过于复杂和频繁,所以时常出现闪烁的情况,一些防止 ...
- MFC中改变控件的大小和位置
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...
- MFC特定函数的应用20160720(SystemParametersInfo,GetWindowRect,WriteProfileString,GetSystemMetrics)
1.SystemParametersInfo函数可以获取和设置数量众多的windows系统参数 MFC中可以用 SystemParametersInfo(……) 函数来获取和设置系统信息,如下面例子所 ...
- 解决Windows 程序界面闪烁问题的一些经验
原帖地址:http://blog.joycode.com/yaodong/archive/2004/11/26/39764.aspx 一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化 ...
- 【Visual C++】Windows GDI贴图闪烁解决方法
一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁. 先来谈谈闪烁产生的原因 原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的 ...
随机推荐
- C语言中main函数的參数具体解释
main函数的定义形式 main函数能够不带參数,也能够带參数,这个參数能够觉得是 main函数的形式參数.C语言规定main函数的參数仅仅能有两个,习惯上这两个參数写为argc和ar ...
- HDU4960Another OCD Patient(间隙dp,后座DP)
Another OCD Patient Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- PocketSphinx语音识别系统语言模型的训练和声学模型的改进
PocketSphinx语音识别系统语言模型的训练和声学模型的改进 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识, ...
- iOS 在TabViewController中的一个ViewController跳转到另一种ViewController
第一步: #import "AppDelegate.h" 步骤二: 在须要跳转的地方: AppDelegate *appDelegate = (AppDelegate *)[[UI ...
- CSDN markdown 编辑 三 基本语法
这是一个副本,在准备好了help档,另外补充一些他们自己的解释. 这一次是不说话UML和LaTEX. 准备抽两篇文章专门谈. 1. 标题和字体大小 markdown字号太少了.觉得应该再加些. 在文字 ...
- WPF 3D:使用变换中的TranslateTransform3D
原文:WPF 3D:使用变换中的TranslateTransform3D 程序效果: WPF 3D中的TranslateTransform3D应该是所有3D变换中最简单的变换,使用起来非常简单,先定义 ...
- ubuntu中KDE与GNOME安装切换
转载:http://apps.hi.baidu.com/share/detail/18919303 1.在Ubuntu中安装KDE桌面命令 sudo apt-get install kUbuntu-d ...
- Apache与Tomcat整合(转)
一 Apache与Tomcat比较联系 apache支持静态页,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由 ...
- 【原创】一个基于简单剪枝的DFS解数独程序
问题来源:leetCode Sudoku Solver Write a program to solve aSudoku puzzle by filling the empty cells. Empt ...
- SQL 编码标准
1. 你必须从别名表,易于使用的表,该表列 实例 select owner,object_id,name from a,b where a.id=b.id; 假设是不正确的别名表.我知道你是怎么访问表 ...
转载▼