VB 版 (精华区)

发信人: zxfsnow (别怕我伤心), 信区: VB
标  题: VB的API编程精粹-3(前面有转载)
发信站: 哈工大紫丁香 (2000年05月31日12:21:17 星期三), 转信

发信人: esc (书剑飘零), 信区: VB
标  题: VB的API编程精粹-3
发信站: 虎踞龙盘东南站 (Fri Aug 20 15:51:41 1999), 转信

第三节:高手进阶


  上面的关于API的调用的例子只是为了带您去Win dows API世界中去探索一下。相信

  您已探索到了一点眉 目并想去实现一些更"好玩"的东西了。好!下面就向您 介绍一


  个很"好玩"同时又会使您的程序看起来更专业化 的一个API调用。

  相信您的机器上一定装有"金山词霸",试着启动它 您发现了什么?启动画面过后它

  "不见了"。把鼠标移到 桌面的右下角,原来它以图标的形式"藏在" Windows 的托盘


  中。用鼠标右击它还会弹出一个菜单功能项供您 选择。现在您一定想把自己的程序

  也放到托?
  下面是此功能的实现步骤:

  1.这里我们调用的API函数是: "Shell_NotifyIcon",在您的模块中添加如下的函

  数声明和常量声明:

  '以下常量告诉系统在托盘中您的图标上发生了什么 操作

  '常量声明

  Public Const WM_MOUSEMOVE = &H200 '在图标上移动鼠标

  Public Const WM_LBUTTONDOWN = &H201 '鼠标左键按下

  Public Const WM_LBUTTONUP = &H202 '鼠标左键释放

  Public Const WM_LBUTTONDBLCLK = &H203 '双击鼠标左键

  Public Const WM_RBUTTONDOWN = &H204 '鼠标右键按下

  Public Const WM_RBUTTONUP = &H205 '鼠标右键释放

  Public Const WM_RBUTTONDBLCLK = &H206 '双击鼠标右键

  Public Const WM_SETHOTKEY = &H32 '响应您定义的热键

  'API函数声明

  Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "

  Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As
Long

  '自定义一个调用API Shell_NotifyIcon要用到的类 型"NOTIFYICONDATA"

  Public Type NOTIFYICONDATA

  cdSize As Long 'NOTIFYICONDATA类型的大小

  hwnd As Long '你的应用程序窗体的名柄

  uId As Long '应用程序图标资源的ID号

  uFlags As Long '使那些参数有效它是以下枚举类型中的

  'NIF_MESSAGE、NIF_ICON、NIF_TIP三组的组合

  uCallbackMessage As Long '鼠标移动时把此消息发给该图标的窗体

  hIcon As Long '图标名柄

  szTip As String*64 '当鼠标在图标上时显示的Tip文本

  End Type


  '这是一个枚举类型它告诉API Shell_NotifyIcon去做什么操作

  Public Enum enm_NIM_Shell

  NIM_ADD=&H40 '在“金碟”中加一图标

  NIM_MODIFY=&H1 '修改“金碟”中的图标

  NIM_DELETE=&H2 '删除“金碟”中的图标

  NIF_MESSAGE=&H1 '使类型"NOTIFYICONDATA"中的uCallbackMessage有效

  NIF_ICON=&H2 '使类型"NOTIFYICONDATA"中的hIcon有效

  NIF_TIP=&H4 '使类型"NOTIFYICONDATA"中的szTip有效

  WM_MOUSEMOVE=&H200 '使鼠标移动消息有效

  End Enum

  '定义一个"NOTIFYICONDATA"类型的变量

  Public nidProgramData As NOTIFYICONDATA

  以上是函数及常量声明和自定义的一个类型变量,下 面是此API函数的调用方法:

  2. 在窗体上用菜单编辑一个具有如下信息的菜单项:

  主菜单:无标题、名称(mainMenu)

  子菜单:标题(API编程)、名称(submnul);

  标题(退出)、名称(submnu2).

  这里只是举个例子,具体的功能你可以根据你的具体需要来编辑此菜单项

  3. 在窗体的Load事件中添加如下代码:

  Private Sub Form_Load()

  '隐藏窗体

  With Me

  ..Top =-10000

  ..Left = -10000

  ..WindowState = vbMinimized

  End With

  '设置类型NOTIFYICONDATA所具有的特征

  With nidprogramData

  ..cbSize = Len(nidProgramData)

  ..hwnd = Me.hwnd .uld = vbNull

  ..uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE

  '触发鼠标移动消息

  ..uCallbackMessage = WM_MOUSEMOVE

  ..hIcon = Me.Icon '“托盘”中放入窗体图标,你可以把窗体的图标换成你所喜欢的
图标

  ..szTip ="VB 的 Win32 API 编程" & vbNullChar

  End With


  '调用该函数

  Shell_NotifyIcon NIM_ADD,nidprogramData

  End Sub

  '根据不同的鼠标消息做不同的操作

  Private Sub Form_MouseMove(Button As inte ger, Shift As lnteger, x As Sing
le, Y As

  Single)

  On Error GoTo Form_MouseMove_err:

  Dim Result As Long

  Dim msg As Long

  'X的值依赖与显示模式的设置

  If Me.ScaleMode = vbpixels Then

  msg = x

  Else

  msg = x/Screen.TwipsPerPixe1X

  End If

  Select Case msg

  Case WM_LBUTTONUP

  '在这里加入鼠标左键释放时你想做的操作

  Case WM_LBUTTONDBLCLK

  '在这里加入双击鼠标左键时你想做的操作

  Case WM_RBUTTONUP

  '通常这里弹出你的功能菜单

  PopupMenu mainMenu

  Case WM_MOUSEISMOVING

  '在这里加入鼠标正在移动时你想做的操作

  End Select

  Exit Sub


  Form_MouseMove_err:

  '在这里加入你的处理异常错误的代码

  End Sub

  4.Run你的程序,您是不是看到了象“金山词霸”一样的功能?相信你此时的感觉

  一定特别“爽”! API的世界j是丰富多彩的,只要你肯细心地去探索它你一定会

  获得许多意想不到的好东西。所以笔者觉得定值得每一个具有“好奇”精神的人

  去探索它。后续的期刊笔者会向读者详细介绍一些更好更“牛”的API调用。
--
既然要注定流浪,风又何必苦苦推难。
    既然帆想要靠岸,海又何必处处阻拦。
  
--

 以科计为本,以产业报国!
  超越自我,飞跃无限!
  

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.235.249]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.199毫秒