| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 940 人关注过本帖
标题:一个没有读懂的代码?
只看楼主 加入收藏
zzhh612
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-3-1
收藏
 问题点数:0 回复次数:4 
一个没有读懂的代码?
在网上流行的系统托盘程序,按说明试了一下,没有成功,代码中有这样一句代码,是调用模块中的函数来向系统栏中加入图标的作用,
Call Icon_Add(Me.hwnd, Me.Caption, IcCardMain.Icon, 0)
其中IcCardMain.Icon是取得图标的句柄,可这个IcCardMain是什么对象呢,例程中仅创建了一个FORM1和为它指定了一个标题栏图标,整个程序除了上述调用,其它再没有涉及到它,请教明白的同仁解答一下.

其涉及到的子过程如下:
Private Sub Form1_Resize()
 '判断窗口是否最小化状态,并且是按最小化按纽后第一次发生Resize事件
 If IsIconic(Me.hwnd) <> 0 And MinFlag = False Then
  MinFlag = True
  IcCardMain.Visible = False '隐藏窗口
  '将窗口图标加入通知栏
  Call Icon_Add(Me.hwnd, Me.Caption, IcCardMain.Icon, 0) //就是这句没看懂
 End If
End Sub



源代码文本见附件
系统托盘程序源码.rar (2.33 KB)


[[it] 本帖最后由 zzhh612 于 2008-4-12 17:18 编辑 [/it]]
搜索更多相关主题的帖子: 代码 
2008-04-12 11:08
jbinghe
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-7-20
收藏
得分:0 
这个调用了icon_add函数,里面的就是参数,而me就是窗体,.后面就是窗体的属性,至于icon_add函数可以到网上查一下就好了。呵呵。
一下你看下
只要我们能截获最小化这个事件发送给窗口的消息,然后换成我们自定义的过程,问题就解决了。大家仔细想一想,当按下最小化按纽时会引发什么事件?最小化时窗口大小会发生变化会引发Form1.Resize事件,我们只要在Form1.Resize事件里用Form1.Visible = False使窗口消失,然后将窗口图标显示到通知栏即可达到我们想要的效果。

  怎样判断发生Resize事件时窗口是最小化状态呢?VB里没有现成的做法,我们可以用非富的API函数。API函数库里有一个函数IsIconic(ByVal hwnd As Long),它就是专门判断窗口是否已最小化的。这样当Form产生Resize事件时,用IsIconic函数判断一下窗口是否为最小化状态,就可知道是否用户按了最小化按钮。

  最关键的一步就是将图标显示在通知栏里,VB里没有现成的做法,我们还得用API函数。API函数库里有一个函数Shell_NotifyIcon(ByVal dwMessage As Long, lpData As NOTIFYICONDATA),是专门操作(包括添加、修改、删除)通知栏里图标的。

  点一下通知栏图标,会出现一些诸如"退出"、"显示窗口"的弹出菜单,怎样实现弹出菜单呢?这个很容易实现,因为点击图标会触发图标所在窗口的MouseDown事件,我们把弹出菜单触发过程写入Form1_MouseDown事件即可。具体例程如下:

  第一步、为了增强程序的可移植性,我们新建一个模块,取名为:NoticeIcon,在此模块中定义一些常量、自定义类型、所需的API函数说明及操作通知栏图标的三个自定义函数(添加、修改、删除),模块NoticeIcon具体代码如下所示:

Public Const DefaultIconIndex = 1 图标缺省索引
Public Const WM_LBUTTONDOWN = &H201 按鼠标左键
Public Const WM_RBUTTONDOWN = &H204 按鼠标右键

Public Const NIM_ADD = 0 添加图标
Public Const NIM_MODIFY = 1 修改图标
Public Const NIM_DELETE = 2 删除图标

Public Const NIF_MESSAGE = 1 message 有效
Public Const NIF_ICON = 2 图标操作(添加、修改、删除)有效
Public Const NIF_TIP = 4 ToolTip(提示)有效

API函数声明
图标操作
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
判断窗口是否最小化
Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long

设置窗口位置和状态(position)的功能
Declare Function SetWindowPos Lib "user32" (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

定义类型
通知栏图标状态
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type

函数定义
添加图标至通知栏
Public Function Icon_Add(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
 参数说明:iHwnd:窗口句柄,sTips:当鼠标移到通知栏图标上时显示的提示内容
 hIcon:图标句柄,IconID:图标Id号
 Dim IconVa As NOTIFYICONDATA
 With IconVa
  .hwnd = iHwnd
  .szTip = sTips + Chr$(0)
  .hIcon = hIcon
  .uID = IconID
  .uCallbackMessage = WM_LBUTTONDOWN
  .cbSize = Len(IconVa)
  .uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
  Icon_Add = Shell_NotifyIcon(NIM_ADD, IconVa)
 End With
End Function
删除通知栏图标(参数说明同Icon_Add)
Function Icon_Del(iHwnd As Long, lIndex As Long) As Long
 Dim IconVa As NOTIFYICONDATA
 Dim L As Long
 With IconVa
  .hwnd = iHwnd
  .uID = lIndex
  .cbSize = Len(IconVa)
 End With
 Icon_Del = Shell_NotifyIcon(NIM_DELETE, IconVa)
End Function
修改通知栏图标(参数说明同Icon_Add)
Public Function Icon_Modify(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
 Dim IconVa As NOTIFYICONDATA
 With IconVa
  .hwnd = iHwnd
  .szTip = sTips + Chr$(0)
  .hIcon = hIcon
  .uID = IconID
  .uCallbackMessage = WM_LBUTTONDOWN
  .cbSize = Len(IconVa)
  .uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
  Icon_Modify = Shell_NotifyIcon(NIM_MODIFY, IconVa)
 End With
End Function

[[it] 本帖最后由 jbinghe 于 2008-4-13 22:01 编辑 [/it]]
2008-04-13 21:55
jbinghe
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-7-20
收藏
得分:0 
那么这里可能是窗体的name名吧。呵呵。

[[it] 本帖最后由 jbinghe 于 2008-4-13 22:03 编辑 [/it]]
2008-04-13 21:56
zzhh612
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-3-1
收藏
得分:0 
你的分析有道理,按照上一句和API函数调用的参数来看,这应该是一个窗体的名称,
可这是那一个窗体,是怎么和它联系上的,感觉是突然冒出来的.
    在过程中很明显主窗体的name是FORM1,并且这个IcCardMain只在这个过程中有出现,
我怀疑是一个系统常量什么的,可我没有找到任何证据.MSDN中也没有....

还有这个例程也没有通过我的实践,最小化后并没有在系统托盘中出现图标,也不知问题出
在哪里了.

[[it] 本帖最后由 zzhh612 于 2008-4-14 00:02 编辑 [/it]]
2008-04-13 23:59
zhaoguojun081
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2008-11-11
收藏
得分:0 
学习了
2008-11-21 14:56
快速回复:一个没有读懂的代码?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.062633 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved