LabVIEW 实现窗口置顶与透明显示
laiping 2008-8-10
摘要:
本文介绍了如何在LabVIEW 实现窗口置顶与透明显示。
关键字:
LabVIEW、API、窗口置顶、透明显示
1.窗口置顶与透明显示功能简单介绍
窗口置顶是指运行程序窗口处于屏幕的最前端显示,即屏幕Z序的顶层窗口,位于其它窗口之上。
透明显示是指窗口以一定的透明度显示,可以查看被窗口覆盖下的内容。
2.相关API
Labview的VI属性节点Is Frontmostf无法实现窗口置顶功能,无相关VI直接控制窗口置顶与透明显示,所以要实现此功能得调用相关Windows API。主要使用到以下二个API:
SetLayeredWindowAttribute 、SetWindowPos。
2.1
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
参数说明:
Hwnd:是透明窗体的句柄
crKey:为颜色值,// 掩码的颜色,可以用RGB(r,g,b)来指定
bAlpha:是透明度,取值范围是[0,255]
dwFlags:是透明方式,可以取两个值:
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。
LWA_ALPHA = 0x2
LWA_COLORKEY = 0x1
也可以取两个值的组合:LWA_ALPHA Or LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性。(旧的sdk没有定义这个属性,所以可以直接指定为0x80000)。
2.2
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
这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。返回值:Long,非零表示成功,零表示失败。
参数说明:
hwnd:欲定位的窗口
hWndInsertAfter:窗口句柄。在窗口列表中,窗口hwnd会置于这个窗口句柄的后面。也可能选用下述值之一:
0:将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序
-1:将窗口置于列表顶部,并位于任何最顶部窗口的前面
-2:将窗口置于列表顶部,并位于任何最顶部窗口的后面
x:窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示
y:窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示
cx:指定新的窗口宽度
cy:指定新的窗口高度
wFlags:可以是下面一个值或几个数值的和:
&H1:不改变大小
&H2:不改变位置
&H4:不改变Z序列(忽略 hWndInsertAfter 参数)
&H10:不激活窗体
&H40:显示窗体
&H80:隐藏窗体
注解:窗口成为最顶级窗口后,它下属的所有窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有下属和物主窗口也会转为非最顶级。Z序列用垂直于屏幕的一根假想Z轴量化这种从顶部到底部排列的窗口顺序。
3.在LabVIEW实现窗口置顶与透明显示步骤
3.1获取当前窗口句柄
要使窗口置顶与透明显示,首先得获取当前窗口句柄,方法是调用Windows API函数FindWindowA,其原型为
HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName)
IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。
IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
注意:在LV中调用该函数,第一个参数lpClassName其类型必须指定为LONG,否则不能成功获取窗口句柄。第二个参数lpWindowName类型为String,窗口名可以由LV属性节点LV Name获取。
3.2设置窗口属性
首先调用GetWindowLongA函数获取当前窗口信息,然后调用SetWindowLongA函数改变窗口相关信息。
3.3窗口置顶
调用SetWindowPos函数使当前窗口处于顶层。
3.4窗口透明
调用SetLayeredWindowAttributes函数使窗口透明。
4.程序框图
4.1 Block Diagram如下图所示:
4.2 Front Panel如下图所示:
5.结语
本文详细讲解在LV中实现窗口置顶与透明显示的操作步骤。结合Windows API,LabVIEW可以实现很多用其自身语言无法实现的功能。一个需要特别注意的是在调用相关API函数时,各参数类型一定要与LV的类型相匹配,否则不能成功操作。
参考文档:
新编Windows API参考大全。