11.6.2 截图模块主窗体的设计与实现(3)
【代码解析】
第5、6行获取屏幕的宽度及高度。第7行调用函数SetWindowPos()设置屏幕的位置。第9~11行获取消息框的大小,并设置消息框的位置。第12行设置消息框中显示的消息内容。其中,SetWindowPos()函数是本函数的关键,它可以设置窗体的位置、大小及层次关系,函数原型如下:
- BOOL SetWindowPos(
- HWND hWnd, //窗口句柄
- HWND hWndlnsertAfter, //Z序中的位于被置位置
- int X, //以客户坐标指定窗口新位置的左边界
- int Y, //以客户坐标指定窗口新位置的顶边界
- int cx, //以像素指定窗口的新的宽度
- int cy, //以像素指定窗口的新的高度
- UNIT.Flags //窗口尺寸和定位的标志
- );
SetWindowPos()函数的参数hWndlnsertAfter是指,在Z序中位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,或表11.5中值之一。
表11.5 窗体Z序值表
|
值< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
说 明 |
|
HWND_BOTTOM |
将窗口置于Z序的底部。如果参数hWnd标识
了一个顶层窗口,则窗口失去顶级位置,
并且被置在其他窗口的底部 |
|
HWND_NOTOPMOST |
将窗口置于所有非顶层窗口之上(即在所有
顶层窗口之后)。如果窗口已经是非顶层窗
口则该标志不起作用 |
|
HWND_TOP |
将窗口置于Z序的顶部 |
|
HWND_TOPMOST |
将窗口置于所有非顶层窗口之上。即使窗口
未被激活窗口也将保持顶级位置 |
参数uFlags是窗口尺寸和定位的标志。该参数可以是表11.6中值的组合。
表11.6 窗体尺寸位置标示值表
|
值 |
说 明 |
|
SWP_ASNCWINDOWPOS |
如果调用进程不拥有窗口,系统会向拥
有窗口的线程发出需求。这样就防止了
调用线程在其他线程处理需求的时候发生死锁 |
|
SWP_DEFERERASE |
防止产生WM_SYNCPAINT消息 |
|
SWP_DRAWFRAME |
在窗口周围画一个边框(定义在窗口类描述中) |
|
SWP_FRAMECHANGED |
给窗口发送WM_NCCALCSIZE消息,
即使窗口尺寸没有改变也会发送该消息。
如果未指定这个标志,只有在改
变了窗口尺寸时才发送WM_NCCALCSIZE |
|
SWP_HIDEWINDOW |
隐藏窗口 |
|
SWP_NOACTIVATE |
不激活窗口。如果未设置标志,则窗口被
激活,并被设置到其他最高级窗口或
非最高级组的顶部(根据参数hWndlnsertAfter设置) |
|
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序(忽略hWndlnsertAfter参数) |
|
SWP_SHOWWINDOW |
显示窗口 |