VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - Win Api在VB中的妙用
发表评论(0)作者:, 平台:, 阅读:10222, 日期:2000-05-21
Win Api在VB中的妙用



  Windows API作为一套功能强大的应用程序接口,使VB可以实现对Windows底层的控制,完成VB不具有的功能。下面介绍几种使用API函数的方法。

  一、制作特殊窗口

  1.各种形状的窗口(仅给出了函数名,具体定义可以查阅API Viewer)

  1)CreateEllipticRgn 建立一个椭圆形的区域;

  2)CreateRoundRectRgn 建立一个圆角矩形的区域;

  3)CreatePolygonRgn 建立一个多边形区域;

  4)CreatePolyPolygonRgn建立多个可重叠的多边形区域;

  5)CreateRectRgn 建立一个矩形区域;

  6)CombineRg连接两个区域,通过代入不同的参数可以实现多种合并方式;

  7)SetWindowRgn 设定窗口的范围,使用前边创建的区域;

  8)FrameRgn 在指定区域画上

边框。

  下边的程序就是建立一个形如“棒槌”的窗口:

Private Sub Form1_Load()

Dim p, q As Long

p = CreateEllipticRgn(0, 0, 200, 200) ′通过制定左上角和右下角的坐标建立一个圆

q = CreateRoundRectRgn(40, 120, 160, 400, 20, 20) ′通过制定左上角和右下角的坐标以及圆角的宽度建立一个圆角矩形

CombineRgn p, q, p, RGN_OR ′联合两个区域,使用或(就是取并集)运算

SetWindowRgn hWnd, p, True ′设置窗口区域

Me.Refresh ′刷新窗口

End Sub

  2.浮动窗口

  Delphi中实现浮动窗口非常容易,只要在属性栏中设置就可以。用VB实现就只有借助于API函数:

SetWindowPos hWnd,HWND_TOPM?

OST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE+SWP_SHOWWINDOW就可以了。其中hWnd是窗口的句柄,HWND_TOPMOST指定了窗口的位置—总是在最上边。如果你要取消这个属性,只要把TOPMOST改成NOTOPMOST就可以了。后面4个参数指定了窗口的位置和大小,和VB提供的MOVE方法一样。不过最后一个参数如果指定了SWP_NOMOVE(不改变位置)和 SWP_NOSIZE(不改变大小),那么这四个参数就会被忽略。

  3.透明窗口

  去年的《电脑报》上提供了一个制作透明窗口的办法,这里再介绍另一种方法:

Private Sub Form1_Load()

Dim p As Long

p = GetWindowLong(hWnd,GWLEX?

STYLE) ′取得当前窗口属性

SetWindowLong hWnd, GWL_EXSTY?

LE,p + WS_EX_TRANSPARENT

′加上一个透明属性

Me.Refresh

End Sub

  GetWindowLong 和 SetWindowLong 配合使用还可以更改窗口的不少属性,有兴趣的读者不妨一试。

  二、读取外部图标

  下面的一段程序就显示了如何读取程序中的图标,其中Picture1是一个图像框,dlgOpen是一个标准对话框,Command1是一个按钮;ExtractIcon函数有三个参数,第一个参数指定调用的应用程序,一般都用App.hInstance;第二个参数指定图标文件,可以是DLL、EXE和ICO。第三个参数的不同就决定了其返回值的不同:如果代入-1,就返回文件中包含的图标数,代入0则返回第一个图标的句柄,其余依次类推。

Private Sub Command1_Click()

Static total As Long,p(50) As Long,i As Integer

dlgOpen.Filter = ″图标|*.Exe;

*.Ico;*.Dll″

dlgOpen.ShowOpen

If Dir(dlgOpen.filename)<>″″ Then

If ExtractIcon(App.hInstance, dlgOpen.filename, -1) = 0 Then ′如果没有图标

MsgBox ″No Icon!″

Else

total = ExtractIcon(App.hIns?

tance, dlgOpen.filename, -1)

′取得总图标数

For i = 0 To total - 1

p(i) = ExtractIcon(App.hIn?

stance, dlgOpen.filename, i) ′读取每个图标

Next i

For i = 0 To total - 1 ′依次显示每个图标

DrawIcon Picture1.hdc, 34 * i, 0, p(i)

Next i

End If

End If

End Sub

  三、在桌面上画图

  下面一段程序就是使用API函数在屏幕上画图标。(注:p是图标的句柄,可以由ExtractIcon取得)

deskhwnd = GetNextWindow(hwnd, GW_HWNDLAST) ′取最下面一个窗口

deskdc = GetWindowDC(deskhwnd)

′取窗口的情景设备

For i=0 To Screen.Width/32/15 ′将屏幕坐标单位换算成“Pixel”,并计算可画的图标数

For j=0 To Screen.Height/32/15

DrawIcon deskdc, 32*i, 32*j, p

′在桌面上画图

Next j

Next i

  用函数GetNextWindow取得其句柄,用函数GetWindowDC取出它的虚拟设备。不过,一旦窗口被覆盖,图标就会消失。

  四、屏蔽系统功能键

  在去年《电脑报》第22期上介绍了一种在Delphi中屏蔽系统功能键的方法。可是在VB中无论你怎么设置数据类型,系统总是提示“数据类型不匹配”, 下面就是API Viewer中给出的定义:

  Declare Function SystemParametersInfo Lib ″user32″ Alias “SystemParametersInfoA” (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long

  笔者经过反复思考,终于恍然大悟:看到黑体的“ByVal”了吗?问题就出在这里。原来该函数使用的lpvParam 参数应该按地址传送而非按值传送,然而VB Viewer 中使用的是按值传送,所以会出现错误提示。

(福建 桃花岛主)