尺寸和位置
窗口的尺寸和位置是由一个限定矩形来表示的,它给出了相对于屏幕或父窗口的坐标。对于顶层窗口来说这个坐标是相对于屏幕左上角(由于桌面窗口一般是没有边框的),对于子窗口则是相对于父窗口的左上角的坐标。应用程序在创建窗口时指定窗口的初始尺寸和位置,也可随时改变窗口的尺寸和位置。
尺寸
窗口的尺寸(宽和高)是以象素为单位的,一个窗口的高度和宽度都可以为0,如果应用程序把某个窗口的高度和宽度都置成0,Windows系统就把尺寸置成默认的最小窗口尺寸。应用程序是通过带有SM_CXMIN和SM_CYMIN标志的函数GetSystemMetrics来获取最小窗口的默认尺寸的。
应用程序可能要创建具有一定尺寸的客户区的窗口,函数AdjustWindowRect和AdjustWindowRectEx可根据所设计的客户区尺寸来计算所需窗口的尺寸应用程序再把计算结果传给函数CreateWindowEx。
应用程序可把窗口的尺寸改变得很大,但最好不要超过屏幕的大小。在设置窗口的尺寸之前,应用程序应该用带有SM_CXSCREEN和SM_CYSCREEN标志的函数GetSystMetrics来检查屏幕的宽度和高度。
应用程序可能要创建具有一定尺寸的客户区的窗口,函数AdjustWindowRect和AdjustWindowRectEx可根据所设计的客户区尺寸来计算所需窗口的尺寸应用程序再把计算结果传给函数CreateWindowEx。
应用程序可把窗口的尺寸改变得很大,但最好不要超过屏幕的大小。在设置窗口的尺寸之前,应用程序应该用带有SM_CXSCREEN和SM_CYSCREEN标志的函数GetSystMetrics来检查屏幕的宽度和高度。
位置
窗口的位置是由它左上角的坐标决定的,这些坐标有时叫做窗口坐标,总是相对于屏幕的左上角,对于子窗口来说,则是相对于其父窗口客户区的左上角。例如,某个顶层窗口的坐标是(10,10),那么它就被定位在屏幕左上角向右10个象素,向下10个象素的位置。如果一个子窗口的坐标是(10,10)。那么它就被定位在其父窗口客户区左上角向右10个象素向下10个象素的位置。
函数WindowFromPoint用来检取包含屏幕上某一点的窗口的句柄,函数ChildWindowFromPoint则用来检取包含父窗口客户区中某一点的子窗口的句柄,这个点的坐标属于客户区坐标。
默认的尺寸和位置
函数WindowFromPoint用来检取包含屏幕上某一点的窗口的句柄,函数ChildWindowFromPoint则用来检取包含父窗口客户区中某一点的子窗口的句柄,这个点的坐标属于客户区坐标。
默认的尺寸和位置
应用程序可让Windows系统计算一个顶层窗口的初始尺寸相位置,这是通过在函数CreateWindowEx中指定CS_USEDEFAULT常量。如果应用程序把窗口的坐标置成CW_USEDEFAULT,而且应用程序还没有创建别的顶层窗口,Windows系统就把新窗口的位置设置在相对于屏幕左上角的位置上,否则Windows系统就把窗口的位置设置在相对于应用程序最近创建的顶层窗口的位置。同样,如果宽度和高度都设置成CW_USEDEFAULT window系统就会计算新窗口的尺寸,如果应用程序已创建了其它的顶层窗口,Windows系统就根据应用程序最近创建的顶层窗口的尺寸来计算新窗口的尺寸。如果在创建子窗口或弹出窗口时设置CW_USEDEFAULT风格,那么WINDOWS系统就把窗口的尺寸设置成默认的最小窗口的尺寸。
跟踪尺寸
window系统管理具有WS_THICKFRAME风格的窗口的最小和最大跟踪尺寸,具有这种风格的窗口有一个改变大小边框。最小跟踪尺寸是用户通过拖动窗口大小边框所能达到的最小窗口尺寸。同样,最大跟踪尺寸是用户通过拖动窗口大小边框所能达到的最大窗口尺寸。
窗口的最小和最大跟踪尺寸是在Windows系统创建窗口时设置的系统定义的默认值。应用程序可通过处理WM_GETMINMAXINFO消息来获取或改变这些默认值。
窗口的最小和最大跟踪尺寸是在Windows系统创建窗口时设置的系统定义的默认值。应用程序可通过处理WM_GETMINMAXINFO消息来获取或改变这些默认值。
系统命令
如果应用程序有一个带有system菜单的窗口,就可以通过发送系统命令改变窗口的大小相位置,系统命令是在用户从system菜单中选择命令时产生的,应用程序可通过向窗口发送WM_SYSCOMMAND消息来模拟用户的活动。下表列出的系统命令影响窗口的大小和位之:
风格 |
描述 |
SC_CLOSE
|
关闭窗口,这条命令向窗口发送一条WM_CLOSE消息,窗口完成清除和销毁所要做的每一步工作。
|
SC_MAXIMIZE
|
最大化窗口
|
SC_MINIMIZE
|
最小化窗口
|
SC_RESTORE
|
恢复最小或最大窗口到原来的大小相位置
|
SC_SIZE
|
启动一个改变大小命令。用户可使用鼠标或键盘改变一个窗口的大小
|
Z次序
窗口的Z次序表明了覆盖窗口堆中窗口的位置,这个窗口堆是按一个假想的轴定位的,这个轴就是从屏幕向外伸展的Z轴。Z次序最上面的窗口覆盖所有其它的窗口,Z次序最底层的窗口被所有其它的窗口覆盖。应用程序设置窗口在Z次序中的位置是通过把它放在个给定的窗口的后面,或是放在堆的顶部或底部。
Windows系统管理三个独立的Z次序一个用于顶层窗口、一个用于兄弟窗口还有一个是用于最顶层窗口。最顶层窗口覆盖所有其它非最顶层窗口。而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST风格创建最项层窗口。
一股情况下,Windows系统把刚创建的窗口放在Z次序的顶部,用户可通过激活另外个窗口来改变Z次序Windows系统总是把活动的窗口放在Z次序的顶部,应用程序可用函数BringWindowToTop把一个窗口放置到Z次序的顶部。函数SetWindowPos和DeferWindowPos用来重排Z次序。
Windows系统管理三个独立的Z次序一个用于顶层窗口、一个用于兄弟窗口还有一个是用于最顶层窗口。最顶层窗口覆盖所有其它非最顶层窗口。而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST风格创建最项层窗口。
一股情况下,Windows系统把刚创建的窗口放在Z次序的顶部,用户可通过激活另外个窗口来改变Z次序Windows系统总是把活动的窗口放在Z次序的顶部,应用程序可用函数BringWindowToTop把一个窗口放置到Z次序的顶部。函数SetWindowPos和DeferWindowPos用来重排Z次序。
改变大小和定位函数
创建了窗口之后,应用程序可调用下列函数来设置窗口的大小和位置,这些函数是MoveWindow、SetWindowPos、DeferWindowPos和SetWindowPlacement。
函数MoveWindow和SetWindowPos差不多,都用来设置单个应用程序窗口的大小和位置。函数SetWindowPos则含有一系列影响窗口显示状态的标志,以及窗口的位置属性。
函数BeginDeferWindowPos、DeferWindowPos和EndDeferWindowPos一起用来同时设置一些窗口的大小、位置、z次序中的位置和显示状态。
函数SetWindowPlacement则用来设置窗口最小和最大时的位置、恢复窗口的尺十和位置及显示状态。
应用程序使用函数GetWindowRect检取窗口限定矩形的坐标,GetWindowRect用窗口的左上角和右下角填充RECT结构,这些坐标是相对于屏幕左上角的,对于窗口也一样。函数ScreenToClient或MapWindowPoints把子窗口限定矩形的屏幕坐标映射成相对于父窗口客户区的坐标。
函数GetClientRect用于检取窗口客户区的坐标,GetClientRect用客户区左上角和右下角坐标填充RECT结构,但这里的坐标是相对于客户区本身的。这就是说,客户区左上角的坐标总是(0,0),右下角的坐标是客户区的宽度和高度。
应用程序使用函数GetWindowRect检取窗口限定矩形的坐标,GetWindowRect用窗口的左上角和右下角填充RECT结构,这些坐标是相对于屏幕左上角的,对于窗口也一样。函数ScreenToClient或MapWindowPoints把子窗口限定矩形的屏幕坐标映射成相对于父窗口客户区的坐标。
函数GetClientRect用于检取窗口客户区的坐标,GetClientRect用客户区左上角和右下角坐标填充RECT结构,但这里的坐标是相对于客户区本身的。这就是说,客户区左上角的坐标总是(0,0),右下角的坐标是客户区的宽度和高度。
尺寸和位置消息
Windows系统要向将要改变大小和位置的窗口发送WM_GETMINMAXINFO消息,例如,用户从System菜单上选中Move和Size命令或单击了大小边框或是标题栏,或者应用程序调用函数SetWindowPos移动或改变窗口大小时,发送WM_GETMINMAXINFO消息。
WM_GETMINMAXINFO消息含有一个MINMAXINFO结构的指针,这个结构是窗口的默认的最大尺寸和位置,以及窗口的最小和最大跟踪尺寸。应用程序可以通过处理WM_GETMINMAXINFO消息并给MINMAXINFO结构的成员适当的设置来改变这些默认值。
接收WM_GETMINMAXINFO消息的窗口必须具有WS_THICKFRAME或WS CAPTION风格,具有WS_THICKFRAME风格的窗口在窗口创建过程中,或是在移动或改变大小时会接收到这条捎息。
Windows系统还会向一个将要改变大小、位置、Z轴中的次序及显示状态时向窗口发送一条WM_WINDOWPOSCHANGING消息,这条消息含有一个WINDOWPOS结构的指针,这个结构指定了窗口新的尺寸、位置、Z轴次序中的位置及显示状态。
设置WM_WINDOWPOSCHANGING消息的WINDOWPOS结构成员对窗口并没有影响,一个必须处理WM_SIZE和WM_MOVE消息的窗口必须把WM_WINDOWPOSCHANGING消息传给函数DefWindowProc,否则Windows系统不会向窗口发送WM_SIZE和WM_MOVE消息。
Windows系统在某窗口创建或被改变大小的时候向该窗口发送WM_NCCALCSIZE消息,Windows系统使用这条消息计算窗口客户区的大小以及相对于窗口的左上角的客户区的位置,窗口通常把这条消息传给默认的窗口过程,但是这条消息对要定制窗口非客户区或在改变窗口大小时保留客户区的某一部分的应用程序来说是很有用的
在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置:
CRect r;
pWnd->GetWindowRect(&r);
这样获得的r是控件相对于屏幕的坐标,然后用ScreenToClient(&r)就可以获得控件相对于父窗口的坐标。如果用GetClientRect(&r)的话,r.left和r.top始终是0,得到的并不是实际坐标。