MFC界面编程 之 基础概念

尺寸和位置


 

窗口的尺寸和位置是由一个限定矩形来表示的,它给出了相对于屏幕或父窗口的坐标。对于顶层窗口来讲这个坐标是相对于屏幕左上角(因为桌面窗口通常是没有边框的),对于子窗口则是相对于父窗口的左上角的坐标。应用程序在建立窗口时指定窗口的初始尺寸和位置,也可随时改变窗口的尺寸和位置。


 

尺寸


 

窗口的尺寸(宽和高)是以象素为单位的,一个窗口的高度和宽度均可觉得0,若是应用程序把某个窗口的高度和宽度都置成0,Windows系统就把尺寸置成默认的最小窗口尺寸。应用程序是经过带有SM_CXMIN和SM_CYMIN标志的函数GetSystemMetrics来获取最小窗口的默认尺寸的。



应用程序可能要建立具备必定尺寸的客户区的窗口,函数AdjustWindowRect和AdjustWindowRectEx可根据所设计的客户区尺寸来计算所需窗口的尺寸应用程序再把计算结果传给函数CreateWindowEx。



应用程序可把窗口的尺寸改变得很大,但最好不要超过屏幕的大小。在设置窗口的尺寸以前,应用程序应该用带有SM_CXSCREEN和SM_CYSCREEN标志的函数GetSystMetrics来检查屏幕的宽度和高度。


 

位置


 

窗口的位置是由它左上角的坐标决定的,这些坐标有时叫作窗口坐标,老是相对于屏幕的左上角,对于子窗口来讲,则是相对于其父窗口客户区的左上角。例如,某个顶层窗口的坐标是(10,10),那么它就被定位在屏幕左上角向右10个象素,向下10个象素的位置。若是一个子窗口的坐标是 (10,10)。那么它就被定位在其父窗口客户区左上角向右10个象素向下10个象素的位置。



函数WindowFromPoint用来检取包含屏幕上某一点的窗口的句柄,函数ChildWindowFromPoint则用来检取包含父窗口客户区中某一点的子窗口的句柄,这个点的坐标属于客户区坐标。



默认的尺寸和位置


 

应用程序可以让Windows系统计算一个顶层窗口的初始尺寸相位置,这是经过在函数CreateWindowEx中指定 CS_USEDEFAULT常量。若是应用程序把窗口的坐标置成CW_USEDEFAULT,并且应用程序尚未建立别的顶层窗口,Windows系统就把新窗口的位置设置在相对于屏幕左上角的位置上,不然Windows系统就把窗口的位置设置在相对于应用程序最近建立的顶层窗口的位置。一样,若是宽度和高度都设置成CW_USEDEFAULT window系统就会计算新窗口的尺寸,若是应用程序已建立了其它的顶层窗口,Windows系统就根据应用程序最近建立的顶层窗口的尺寸来计算新窗口的尺寸。若是在建立子窗口或弹出窗口时设置CW_USEDEFAULT风格,那么WINDOWS系统就把窗口的尺寸设置成默认的最小窗口的尺寸。


 

跟踪尺寸


 

window系统管理具备WS_THICKFRAME风格的窗口的最小和最大跟踪尺寸,具备这种风格的窗口有一个改变大小边框。最小跟踪尺寸是用户经过拖动窗口大小边框所能达到的最小窗口尺寸。一样,最大跟踪尺寸是用户经过拖动窗口大小边框所能达到的最大窗口尺寸。



窗口的最小和最大跟踪尺寸是在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次序。


 

改变大小和定位函数


 

建立了窗口以后,应用程序可调用下列函数来设置窗口的大小和位置,这些函数是MoveWindow、SetWindowPos、DeferWindowPos和SetWindowPlacement。


 

函数MoveWindow和SetWindowPos差很少,都用来设置单个应用程序窗口的大小和位置。函数SetWindowPos则含有一系列影响窗口显示状态的标志,以及窗口的位置属性。


 

函数BeginDeferWindowPos、DeferWindowPos和EndDeferWindowPos一块儿用来同时设置一些窗口的大小、位置、z次序中的位置和显示状态。


 

函数SetWindowPlacement则用来设置窗口最小和最大时的位置、恢复窗口的尺十和位置及显示状态。



应用程序使用函数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,获得的并非实际坐标。