可以使用函数SetWindowPos()和MoveWindow()设置对话框或控件的大小和位置。
目录
1. MoveWindow()
函数原型:
void CWnd::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE);
void CWnd::MoveWindow(LPCRECT lpRect, BOOL bRepaint = TRUE);
函数功能:
改变指定窗口的位置和大小,对基类窗口来说,位置和大小取决于屏幕的左上角;对于子窗口来说,位置和大小取决于父窗口客户区的左上角。对于Owned窗口,位置和大小取决于屏幕左上角。
参数介绍:
@x/y/nWidth/nHeight/lpRect:指定了窗口的新的位置和大小;
@bRepaint:指定了是否要重画CWnd。
如果为TRUE,则CWnd会在OnPaint消息处理函数中接收到一条WM_PAINT消息;
如果为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分无效或重画。
MoveWindow给窗口发送WM_WINDOWPOSCHANGING、WM_WINDOWPOSCHANGED、WM_MOVE、WM_SIZE和WM_NCCALCSIZE消息。
MoveWindow函数发送一条WM_GETMINMAXINFO消息,处理这个消息时,CWnd得到一个改变最大和最小的窗口缺省值的机会。如果传递给MoveWindow成员函数的参数超过了这些值,则在WM_GETMINMAXINFO处理函数种可以用最小值或最大值来代替这些值。
2. SetWindowPos
SetWindwoPos函数改变一个子窗口、弹出式窗口或顶层窗口的尺寸,位置和Z序。子窗口、弹出式窗口以及顶层窗口根据他们在屏幕上出现的顺序排序,顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。
函数原型:
BOOL SetWindowPos(const CWnd *pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags);
函数功能:
该函数改变子窗口、弹出窗口和顶层窗口的大小、位置和Z轴次序。窗口在屏幕上按照它们的Z轴次序排序。在Z轴次序上处于顶端的窗口将程序在所有其它窗口的顶部。子窗口的所有坐标都是客户坐标(相对于父窗口客户区的左上角)。窗口可以被移动到Z轴次序的顶部,既可以通过将pWndInsertAfter设置为&wndTopMost,并确保没有设置SWP_NOZORDER标志,也可以用过设置窗口的Z轴次序使它位于所有现存的顶层窗口上方。当一个非顶层窗口被设置为顶层窗口时,它拥有的窗口也被设为顶层的,它的拥有者不发生变化。如果顶层窗口被重新定位到Z轴次序的顶部(&wndBottom)或任何非顶层窗口之后,则它将不再是顶层窗口。当顶层窗口变为非顶层窗口时,它所有的拥有者和它拥有的所有窗口都变为非顶层窗口。
函数参数:
@pWndInsertAfter:标识一个CWnd对象,该对象是在以Z次序排序的窗口中位于当前窗口前面的那个窗口对象。这个参数是指向某个CWnd对象的指针,也可以是指向下表的指针之一:
取值 | 说明 |
wndBottom | 把当前窗口放在Z次序的底部 |
wndTop | 将当前窗口放置于Z次序的顶部 |
wndTopMost | 将当前窗口设置为一个顶层窗口,放置于所有非顶层窗口之上,即使窗口未被激活也将保持顶层位置 |
wndNoTopMost | 将当前窗口放置于所有非顶层窗口之上,但在所有顶层窗口之后 |
@ x和y:窗口的左上角的x和y坐标;
@ cx和cy:窗口的宽和高;
@ nFlags:设定窗口的尺寸和定位,可以是下表的取值的组合:
取值 | 说明 |
SWP_DRAWFRAME | 在窗口周围绘制一个边框,这是在窗口创建时定义的 |
SWP_FRAMECHANGED | 给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送此消息。如果未指定这个标志,那么只有在改变了窗口尺寸时才发送WM_NCCALCSIZE消息 |
SWP_HIDEWINDOW | 隐藏窗口 |
SWP_NOACTIVE | 不激活窗口。如果未设置此标志,那么窗口被激活,并根据pWndInsertAfter参数的取值将当前窗口设置到其它顶层窗口或非顶层窗口之上 |
SWP_NOCOPYBITS | 清除客户区的所有内容,如果未设置此标志,客户区的有效内容将被保存并且在窗口尺寸更新和重新定位后复制回客户区 |
SWP_NOMOVE | 维持窗口当前位置,这将忽略x和y参数 |
SWP_NOOWNERZORDER | 不改变Z次序的所有者窗口的位置 |
SWP_NOREDRAW | 不重画改变的内容,如果设置此标志,则不会发生任何重画动作,适用于客户区和非客户区(包括标题栏和滚动条)和任何由子窗口移动而露出的父窗口的部分。如果设置了此标志,应用程序必须明确地使窗口无效,并且重画窗口和父窗口中任何需要重画的部分 |
SWP_NOREPOSITION | 与SWP_NOOWNERZORDER标志的作用相同 |
SWP_NOSENDCHANGING | 禁止窗口接收WM_WINDOWPOSCHANGING消息 |
SWP_NOSIZE | 维持窗口的当前尺寸,将忽略cx和cy参数 |
SWP_NOZORDER | 维持当前的Z次序,将忽略pWndInsertAfter参数 |
SWP_SHOWWINDOW | 显示窗口 |