转自于:
http://hi.baidu.com/max_new/blog/item/e2bbe607b1f127c57b8947c0.html
如果你想这么做,有一个API可以实现: SetWindowPos,声明是这样的: Private Declare Function SetWindowPos Lib “user32” Alias “SetWindowPos” (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 虽然参数很多,但实际用起来很简单。hwnd是窗口的句柄,x、y、cx、cy分别是窗口的x和y坐标、宽和高度。hWndInsertAfter用来指定窗口的Z位置(或称Z顺序)。如果你经常接触3D方面的软件,你就知道Z代表深度。这个参数接受5种值:HWND_BOTTOM、 HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST或者另一个窗口的句柄。而wFlags用来指定附加的选项。 你可以用它改变窗口的位置和大小,而且它允许你同时改变Z位置(当然,在VB中不用API你也可以改变窗体大小和位置)。比如让窗口退到最下面,可以这么使用: SetWindowPos Me.hWnd, HWND_BOTTOM, 10&, 10&, 80&, 120&, 0& 想要常居顶端,只需把HWND_BOTTOM改为 HWND_TOPMOST,而HWND_NOTOPMOST则是取消常居顶端,HWND_TOP是把窗口的Z位置改为最前。如果这个参数传递的是另一个窗口的句柄,则是把该窗口的Z 位置更改为在另一个窗口的下面。 非常简单的事情。不过如果像上面一样做,是不是单单改个Z位置也要计算窗口位置和大小?最后一个参数又是干什么用的呢?wFlags可以让SetWindowPos忽略或执行某种行为。这里给出一部分: SWP_DRAWFRAME和SWP_FRAMECHANGED:强制发送 WM_NCCALCSIZE消息给窗口 SWP_HIDEWINDOW:隐藏窗口 SWP_NOACTIVATE:不激活窗口 SWP_NOMOVE:保持当前位置(忽略x和y) SWP_NOREDRAW:窗口不自动重画 SWP_NOSIZE:保持当前大小(忽略cx和cy) SWP_NOZORDER:保持窗口在列表的当前位置(忽略hWndInsertAfter) SWP_SHOWWINDOW:显示窗口 这些参数可以使用Or运算组合,所以如果你不希望改变窗口位置和大小,你只需要给最后一个参数传递(SWP_NOMOVE Or SWP_NOSIZE)即可。如下: SetWindowPos Me.hWnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, SWP_NOMOVE Or SWP_NOSIZE 这里的x、y、cx、cy的值将被忽略。其他值的组合,你可以自己去试试。 WM_NCCALCSIZE消息是在计算窗口的客户区大小时被发送的,它主要是让程序可以收到该消息后重新计算客户区的大小。我们先不管它是不是也能像许多以WM_开头的消息一样由我们发送给程序让它产生作用,但它使用起来的复杂程度让我宁可选择改变窗体大小再改回去。当我们改变窗口的大小时,很明显的就是它一定会重新计算客户区大小以调整外观。既然这个函数可以强制发送WM_NCCALCSIZE消息,那么我们就应该试一试。 SetWindowPos Me.hwnd, 0&, 0&, 0&, 0&, 0&, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOMOVE Or SWP_FRAMECHANGED 为了不改变窗口大小、位置和Z顺序(就是要窗口保持原状),我使用SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOMOVE,让它忽略前面所有的参数,最后加个 Or SWP_FRAMECHANGED 就是让它重新计算客户区大小。把上面的一行放到前一话中更改风格的那一句下面,再执行程序。
参数解释: hWndInsertAfter 窗口叠层位置 HWND_NOTOPMOST= -2 在所有非”普通层”之上的”普通层” HWND_TOP =0在顶层的”普通层” HWND_TOPMOST = -1在所用”普通层”之上的”最顶层” X 窗口左坐标 Y 窗口上坐标 cx 窗口宽度(单位为pixels) cy 窗口高度(单位为pixels) uFlags 附加参数 SWP_DRAWFRAME =0x0020窗口带边框 SWP_FRAMECHANGED =0x0020发送边框改变消息 SWP_HIDEWINDOW =0x0080窗口隐藏 SWP_NOACTIVATE =0x0010不激活窗口 SWP_NOCOPYBITS =0x0100不保留显示缓存的拷贝 SWP_NOMOVE =0x0002不可移动窗口(忽略X,Y参数) SWP_NOOWNERZORDER =0x0200不改变父窗口叠层顺序 SWP_NOREDRAW =0x0008不重画窗口 SWP_NOREPOSITION =0x0200 SWP_NOSENDCHANGING =0x0400不接受窗口位置改变的消息 SWP_NOSIZE =0x0001窗口大小不变(忽略CX,CY参数) SWP_NOZORDER =0x0004不改变叠层顺序(忽略hWndInsertAfter参数) SWP_SHOWWINDOW =0x0040显示窗口 注意:如果要使用上述多个uFlags参数, 只要将几个参数相加的和赋给uFlags即可. Return Values返回值 Remarks 特别说明(不翻译了) All coordinates for child windows are client coordinates (relative to the upper-left corner of the parent window’s client area). A window can be made a topmost window either by setting the hWndInsertAfter parameter to HWND_TOPMOST and ensuring that the SWP_NOZORDER flag is not set, or by setting a window’s position in the Z order so that it is above any existing topmost windows. When a non-topmost window is made topmost, its owned windows are also made topmost. Its owners, however, are not changed. If neither the SWP_NOACTIVATE nor SWP_NOZORDER flag is specified (that is, when the application requests that a window be simultaneously activated and its position in the Z order changed), the value specified in hWndInsertAfter is used only in the following circumstances: · Neither the HWND_TOPMOST nor HWND_NOTOPMOST flag is specified in hWndInsertAfter. · The window identified by hWnd is not the active window. An application cannot activate an inactive window without also bringing it to the top of the Z order. Applications can change an activated window’s position in the Z order without restrictions, or it can activate a window and then move it to the top of the topmost or non-topmost windows. If a topmost window is repositioned to the bottom (HWND_BOTTOM) of the Z order or after any non-topmost window, it is no longer topmost. When a topmost window is made non-topmost, its owners and its owned windows are also made non-topmost windows. A non-topmost window can own a topmost window, but the reverse cannot occur. Any window (for example, a dialog box) owned by a topmost window is itself made a topmost window, to ensure that all owned windows stay above their owner. If an application is not in the foreground, and should be in the foreground, it must call the SetForegroundWindow function. 以上来源于MSDN. |