易语言的SetWindowPos

2025-03-22 01:19:58
推荐回答(2个)
回答1:

没用过这种语言,不过有这个函数的说明,你看一下:

许多软件,特别是占桌面面积不是很大的软件,通常都提供了一个常居顶端的功能(可能有的软件不是这么叫法,但作用是相同的),它的作用是保持窗口一直在其他窗口的上面,可以省去频繁切换窗口的动作。

如果你想这么做,有一个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的值将被忽略。其他值的组合,你可以自己去试试。
好了,这个看起来好像有点复杂的API已经变得很清晰,那么轮到上一话的收尾。

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 就是让它重新计算客户区大小。把上面的一行放到前一话中更改风格的那一句下面,再执行程序。

回答2:

.DLL命令 API_SetWindowPos, 整数型, "user32", "SetWindowPos", 这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。该函数与DeferWindowPos函数相似,只是它的作用是立即表现出来的(在vb里使用:针对vb窗体,如它们在win32下屏蔽或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模块来重设最顶部状态 非零表示成功,零表示失败。会设置GetLastError
.参数 hwnd, 整数型, , 欲定位的窗口
.参数 hWndInsertAfter, 整数型, , 窗口句柄。在窗口列表中,窗口hwnd会置于这个窗口句柄的后面。也可能选用下述值之一:;HWND_BOTTOM:将窗口置于窗口列表底部;HWND_TOP:将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序;HWND_TOPMOST:将窗口置于列表顶部,并位于任何最顶部窗口的前面;HWND_NOTOPMOST:将窗口置于列表顶部,并位于任何最顶部窗口的后面
.参数 x, 整数型, , 窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示
.参数 y, 整数型, , 窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示
.参数 cx, 整数型, , 指定新的窗口宽度
.参数 cy, 整数型, , 指定新的窗口高度
.参数 wFlags, 整数型, , 包含了旗标的一个整数;SWP_DRAWFRAME:围绕窗口画一个框;SWP_HIDEWINDOW:隐藏窗口;SWP_NOACTIVATE:不激活窗口;SWP_NOMOVE:保持当前位置(x和y设定将被忽略);SWP_NOREDRAW:窗口不自动重画;SWP_NOSIZE:保持当前大小(cx和cy会被忽略);SWP_NOZORDER:保持窗口在列表的当前位置(hWndInsertAfter将被忽略);SWP_SHOWWINDOW:显示窗口;SWP_FRAMECHANGED:强迫一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有改变;

以上易格式API 直接复制进易就可以了.说明就在内.