3.4.1
示例演示
打开fadeaway.scx表单的步骤如下。
①
打开“任务窗格管理器”窗口,依次单击“表单”→“透明表单”,打开如图3-14所示的fadeaway.scx表单。
②
移动表单中的滑动块,会改变表单的透明度,从而看到被当前窗口所掩盖部分的内容,如图3-15所示。

图3-14
fadeaway.scx表单

图3-15
半透明效果
3.4.2
分层窗口
通常窗口是以矩形在屏幕上显示的。如果要实现一个圆形窗口,仅仅简单地绘制一个圆形窗口是不够的,这样的话系统还会把窗体按原矩形进行点击检测,并且位于该窗体下的窗口仍将被该窗体矩形所裁剪。在Windows
95/98和Windows
NT 4.0下绘制一个异形窗口是通过SetWindowRgn(
) API函数来实现的,但是使用此方式在频繁更改窗口形状或是在屏幕上拖拽窗口时仍有缺陷存在,即前面的窗口会要求位于其下方的窗口重绘整个区域,这将产生过多的消息和计算量。并且SetWindowRgn(
)只能实现窗体的全透明,而无法实现半透明效果。
分层窗口是从Windows
2000开始提出来的,分层窗口实现了两个截然不同的概念:分层和重定向。使用分层窗口可以在很大程度上改进窗口的性能和视觉效果,如一个复合形状、动画,或者是阿尔法混合效果。启用分层窗口后,系统会自动绘制和重绘分层窗口,以及其下面应用程序的窗口。因此,分层窗口着色平滑,不存在复合窗口区域发生闪烁的缺点。此外,分层窗口还可以半透明,将上下窗口中的内容混合显示。
要建立一个分层窗口,可以在窗口建立后调用SetWindowLong(
)函数设置窗口为WS_EX_LAYERED扩展窗口类型。在设置窗口为扩展类型后,要为一个给定的分层窗口设置不透明或透明颜色值,可以调用SetLayeredWindowAttributes(
)函数。注意WS_EX_LAYERED不能被用于包含在Visual
FoxPro主窗口中的表单窗口,而只能用于作为顶层表单的窗口。
3.4.3 SetWindowLong( )函数
该函数用于指定窗口的属性。其声明方式如下:
DECLARE Integer SetWindowLong IN User32 ;
Long hwnd, Long nIndex, Long dwNewLong
语法格式如下:
SetWindowLong(hWnd, nlndex,dwNewLong)
其中,hWnd是要设置窗口的句柄;nIndex指定要设置的窗口的属性,可用值如表3-1所示;dwNewLong是要为属性设置的新值。
表3-1
nIndex参数的可用值
|
常量 |
属性值 |
说明 |
|
GWL_WNDPROC |
-4 |
为窗口过程设定一个新的地址 |
|
GWL_HINSTANCE |
-6 |
设置窗口句柄 |
|
GWL_HWNDPARENT |
-8 |
当前窗口的父窗口句柄 |
|
GWL_ID |
-12 |
设置窗口标识符 |
|
GWL_STYLE |
-16 |
设定窗口风格 |
|
GWL_EXSTYLE |
-20 |
设置窗口的扩展风格 |
|
GWL_USERDATA |
-21 |
设置与窗口有关的32位值,每一个窗口均有一个由创建该窗口的应用程序使用的32位值。当hWnd参数标识了一个对话框时,也可使用下面的DWL_DLGPROC、DWL_MSGRESULT和DWL_USER值 |
|
DWL_DLGPROC |
4 |
设置对话框过程的新地址 |
|
DWL_MSGRESULT |
0 |
设置在对话框过程中处理的消息的返回值 |
|
DWL_USER |
8 |
设置的应用程序私有的新的额外信息,例如一个句柄或指针 |
分层窗口WS_EX_LAYERED类型的常量值为0x00080000。例如,要设置一个窗口为扩展类型中的分层窗口风格,可以在表单的Init事件中加入下列代码:
#DEFINE GWL_EXSTYLE -20
#DEFINE WS_EX_LAYERED 0x00080000
DECLARE SetWindowLong IN Win32Api
Integer, Integer, Integer
=SetWindowLong(THISFORM.hwnd,GWL_EXSTYLE,WS_EX_LAYERED)
3.4.4 SetLayeredWindowAttributes( )函数
该函数用来设置一个分层窗口的透明和不透明的颜色键值。其声明方式如下:
DECLARE Integer SetLayeredWindowAttributes IN User32 ;
Long hWnd, Long crKey, Long bAlpha, Long
dwFlags
语法格式如下:
SetLayeredWindowAttributes(hWnd, crKey, bAlpha,
dwFlags)
其中,hWnd是分层窗口的句柄。crKey指定一个COLORREF值,即在透明窗口中透明的颜色,所有的这种颜色都将被窗口设置成透明,透明部分将不再进行点击检测。要生成COLORREF,可以使用Visual
FoxPro的RGB(
)函数。bAlpha用于窗口的透明度,该值在0~255之间,0为透明,255为不透明。dwFlags指定函数的操作方式,属性值为1,则把在crKey中指定的颜色在表单中透明;属性值为2,则使用bAlpha
指定的值来确定整个分层窗口的透明度。
3.4.5
设置表单为分层窗口
要设置一个表单为分层窗口,必须将该表单设置为一个顶层表单,即该窗口只能显示在Windows桌面上,而不能显示在Visual
FoxPro主窗口中。要将一个表单设置为顶层表单,应当将表单的ShowWindow属性设置为2。
在表单的Init事件中包含有下列代码,用于判断当前的操作系统版本、声明API函数,并设置当前窗口为分层窗口,以及指定窗口的透明度。
DODEFAULT()
#DEFINE BADOS_LOC "该示例只能运行在Windows
2000或更高版本中。"
IF VAL(OS(3))<5 &&判断当前的操作系统版本
MESSAGEBOX(BADOS_LOC)
RETURN .F.
ENDIF
*!*
声明API函数
DECLARE SetWindowLong In Win32Api AS
_Sol_SetWindowLong Integer, Integer, Integer
DECLARE SetLayeredWindowAttributes
In Win32Api AS _Sol_SetLayeredWindowAttributes Integer, Integer,
Integer, Integer
*!*
设置窗口为分层窗口,窗口句柄可以通过表单的hWnd属性获得
_Sol_SetWindowLong(THISFORM.hWnd,
-20, 0x00080000)
*!*
下面命令的的第4个参数,设置分层窗口将按其中第3个参数指定的透明度进行显示
_Sol_SetLayeredWindowAttributes(THISFORM.hWnd, 0, 255, 2)
*!*
将焦点移动到滑动块对象
THISFORM.Olecontrol1.SetFocus()
3.4.6
调整表单的透明度
可以通过SetLayeredWindowAttributes(
)函数的bAlpha参数来指定表单的透明度,表单中滑尺控件的Max属性值为25,当移动滑动块时,会将移动块的值乘以10来作为当前的透明度值,当移动到最右边时,则会使用255作为透明度值,而不是250(25×10)。该控件的Change事件的代码如下:
LOCAL lnValue
DO CASE
CASE THIS.Value = 0 &&滑动块移动到最左边
lnValue = 0
CASE THIS.Value = 25 &&滑动块移动到最右边
lnValue = 255
OTHERWISE
lnValue = THIS.Value * 10
ENDCASE
_Sol_SetLayeredWindowAttributes(THISFORM.hWnd, 0, lnValue, 2) &&设置透明度
|