MoveWindow and SetWindowPos

转自:http://blog.sina.com.cn/s/blog_82c346de0100u7kq.html

MoveWindow and SetWindowPos

(2011-09-14 15:56:51)

转载▼

标签:

杂谈

分类: MFC

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)。

參数:

hWnd:窗体句柄。

x:指定窗体的新位置的左边界。

Y:指定窗体的新位置的顶部边界。

nWidth:指定窗体的新的宽度。

nHaight:指定窗体的新的高度。

bRepaint:确定窗体是否被刷新。假设该參数为TRUE,窗体接收一个WM_PAINT消息;假设參数为FALSE。不发生不论什么刷新动作。

它适用于客户区。非客户区(包含标题栏和滚动栏)。及因为移动子窗体而露出的父窗体的区域。假设參数为FALSE,应用程序就必须明白地使窗体无效或重画该窗体和须要刷新的父窗体。

返回值:假设函数成功,返回值为非零;假设函数失败。返回值为零。若想获得很多其它错误信息。请调用GetLastError函数。

备注:假设bRepaint为TRUE。系统在窗体移动后马上给窗体过程发送WM_PAINT消息(即由MoveWindow函数调用 UPdateWindow函数)。假设bRepaint 为FALSE,系统将WM_PAINT消息放在该窗体的消息队列中。消息循环仅仅有在派遣完消息队列中的其它消息时才派遣WM_PAINT消息。

MoveWindow给窗体发送WM_WfNOWPOSCHANGING。WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE消息,

速查:Windows NT:3.1以上版本号:Windows:95以上版本号。Windows CE:1.0以上版本号:头文件:winuser.h。库文件:user32.lib。

我收集和学习别人的文章,我对这些文章的作者或译者表示感谢

改变控件的大小和位置

用CWnd类的函数MoveWindow()或SetWindowPos()能够改变控件的大小和位置。

void MoveWindow(int x,int y,int nWidth,int nHeight);

void MoveWindow(LPCRECT lpRect);

第一种使用方法需给出控件新的坐标和宽度、高度;

另外一种使用方法给出存放位置的CRect对象;

例:

CWnd *pWnd;

pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针,IDC_EDIT1为控件ID号

pWnd->MoveWindow( CRect(0,0,100,100) );    //在窗体左上角显示一个宽100、高100的编辑控件

SetWindowPos()函数使用更灵活,多用于仅仅改动控件位置而大小不变或仅仅改动大小而位置不变的情况:

BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);

第一个參数我不会用。一般设为NULL;

x、y控件位置;cx、cy控件宽度和高度。

nFlags经常使用取值:

SWP_NOZORDER:忽略第一个參数;

SWP_NOMOVE:忽略x、y,维持位置不变;

SWP_NOSIZE:忽略cx、cy,维持大小不变;

例:

CWnd *pWnd;

pWnd = GetDlgItem( IDC_BUTTON1 );    //获取控件指针,IDC_BUTTON1为控件ID号

pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );    //把button移到窗体的(50,80)处

pWnd = GetDlgItem( IDC_EDIT1 );

pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );    //把编辑控件的大小设为(100,80)。位置不变

pWnd = GetDlgItem( IDC_EDIT1 );

pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );    //编辑控件的大小和位置都改变

以上方法也适用于各种窗体

时间: 2024-10-28 23:00:32

MoveWindow and SetWindowPos的相关文章

MoveWindow和SetWindowPos

1.MoveWindow()用来改变窗口位置或大小.void MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE);void MoveWindow(LPCRECT lpRect, BOOL bRepaint = TRUE); 2.SetWindowPos不仅可以用来改变窗口位置和大小,还可以设置窗口Z序特性.BOOL SetWindowPos( const CWnd* pWndInsertAfter, in

如何弹出一个窗口气泡(使用定时器向上移动)

原文链接:http://blog.csdn.net/tangaowen/article/details/5108980 如何弹出一个窗口气泡 最近在工作中遇到这样一个需求,就是需要将一个窗口从右下角任务栏下面缓缓的上升到任务栏的上面,现在有很多的软件都有这样的气泡,比如:搜狗输入法的词条更新窗口,还比如CSDN的广告窗口等等. 1.首先 将要弹出的窗口移动到任务栏(当前屏幕)以下 2.然后,获得任务栏(本质是个窗口)的高度,这样就可以知道窗口最终的位置了 3.然后,计算获得窗口最终停止的位置:计

window窗口详解

窗口 在图形化的基于win32的应用程序,窗口是屏幕的矩形区域,应用程序显示输出并接收来自用户的输入,因此,一个图形化基于win32的应用程序的首要任务之一就是创建一个窗口. 窗口与其它窗口共享屏幕,[本事]包括来自其它应用程序的窗口,每次只有一个窗口可以接收来自用户的输入,用户可以使用鼠标.键盘或其它输入设备与此窗口以及拥有该窗口的应用程序进行交互. 关于窗口 这个概述描述了应用程序用来创建和使用窗口的编程单元:管理窗口之间的关系:以及大小.移动.和显示窗口:概述包括以下主题: 桌面窗口  

【转载】ATL问题集

原文:http://blog.csdn.net/fengrx/article/details/4171629 这些问题是以前在csdn当版主是一些朋友整理的,今天找到了,贴到这里来! #1 如何使用控件不能改变大小? 答:有时我们需要创建不可改变大小的控件,像那种在运行时没有界面的控件(例:时间控件,SysInfo 等),想做到这种功能的话,请把以下代码加入到控件类的构造函数: m_bAutoSize = TRUE; SIZEL size = {24, 24}; AtlPixelToHiMetr

窗口和控件闪烁解决方案

对于MFC程序员来说做UI开发是痛苦的事情,不过大多数情况下我们都需要做这件事情,因为MFC自带的控件实在是太简陋了.这时候我们多半会涉及到自绘控件,随之而来的很可能就是窗口和控件的闪烁问题.这篇文章希望对MFC的窗口和控件闪烁问题做一个尽量全面的总结. 一.闪烁的原因 引起闪烁的原因很多,以至于网上有n多种解决闪烁问题的方法:如果你按照某一种方法做了仍然没有解决你的问题,请不要认定这个方法有问题,而是你没有对上号.如果你对这个解释不满意的话,我们就来深究一下到底是什么引起了闪烁.从原理上讲,闪

(转)解决WINDOWS 程序界面闪烁问题的一些经验

一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁. 先来谈谈闪烁产生的原因 原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期. 一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的. 这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个刷新周期内完成,那么给人的视觉感受就是,先看

MFC控件随对话框大小改变而改变

这也是我项目中碰到的问题,要让对话框中的控件随着对话框大小的变化进行自动调整,一般的做法是在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例. 但是由于需要自己计算,并且还有各种系统引起的情况,比如WIN7里有个选项"拖动时显示窗口内容",选中与不选中导致对话框内容显示完全不一样,选中时错误,不选正确,确实让人头大. 如EasySize是一个很好解决方案,用一些宏封装了内部的实现机制,使用起来方便快捷.原文地址:http:/

Windows media player控件第二次播放时无法全屏

新建MFC工程,插入windows media player control,属性设置fullscreen为true,设置好URL参数. 添加CWMPPlayer4,CWMPControls3类. 控件绑定关联变量CWMPPlayer4 m_player并设CWMPControls3 m_control = m_player.get_controls(); 为了达到循环播放的目的,响应PlayStateChange消息,消息处理函数中是如下两句: m_control.play(); m_play

nsis页眉铺满图片

这是群里有人经常询问的一个问题,其实自己仔细看看帮助文档,问问百度谷歌,很好解决.无非是两个方案. 第一,使用ResHacker之类的工具修改nsis自带的ui模版,控件id为1046,用鼠标将控件拖至铺满整个页眉保存后在脚本里面引用即可 第二代码解决这个问题,其实感觉还是修改ui模版是比较直观的办法,也好理解,但代码解决也无不可,看个人的习惯和能力,用代码解决有两个方式,API函数MoveWindow或者SetWindowPos,这两个函数谈不上孰优孰劣,我个人觉得使用MoveWindow比较