首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

任务栏图标与mousemove事件的有关问题

2012-03-20 
任务栏图标与mousemove事件的问题!谁能解释一下,蓝色部分的意思,X为什么会与WM_LBUTTONUP或WM_RBUTTONUP的

任务栏图标与mousemove事件的问题!
 
谁能解释一下,蓝色部分的意思,X为什么会与WM_LBUTTONUP或WM_RBUTTONUP的值相等!一个坐标值,一个是消息的参数值!为什么可以这样用?


Option Explicit
 Const max_tooltip As Integer = 64
 Const nif_icon = &H2 '删除图标
 Const NIF_MESSAGE = &H1 'NIF_MESSAGE指定uCallbackMessage有效
 Const NIF_TIP = &H4 'NIF_TIP指定szTip有效
 Const NIM_ADD = &H0 '添加图标到任务栏提示区
 Const NIM_DELETE = &H2
 Const WM_MOUSEMOVE = &H200
 Const WM_LBUTTONDOWN = &H201
 Const WM_LBUTTONUP = &H202
 Const WM_LBUTTONDBLCLK = &H203
 Const WM_RBUTTONDOWN = &H204
 Const WM_RBUTTONUP = &H205
 Const WM_RBUTTONDBLCLK = &H206
 Const SW_RESTORE = 9
 Const SW_HIDE = 0
 Private Type NOTIFYICONDATA
  cbSize As Long 'cbSize是NOTIFYICONDATA结构的大小
  hwnd As Long 'hWnd是当前窗口的句柄
  uID As Long 'uID指定图标的标识符
  uFlags As Long 'uFlags是一组参数
  uCallbackmessage As Long 'uCallbackMessage是一个自定义消息,当鼠标在图标所属的正方形区域内有消息发生,比如单击了图标时,系统就会发送一个消息到uCallbackMessage中
  hIcon As Long 'hIcon是图标的句柄
  szTip As String * max_tooltip 'szTip指定的文字信息会在你将鼠标移到图标上时以浮动方式显示出来
End Type
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _
  ByVal nCmdShow As Long) As Long
   
Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" _
  (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
'dwMessage指定你要加入?删除?还是修改图标 分别为NIM_ADD?NIM_DELETE和NIM_MODIFY
'lpData指向NOTIFYICONDATA类型变量的指针

Private nfIconData As NOTIFYICONDATA

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lMsg As Single
lMsg = X / Screen.TwipsPerPixelX
If lMsg = WM_RBUTTONUP Or lMsg = WM_LBUTTONUP Then Me.PopupMenu sys
End Sub

Private Sub Command1_Click()
  nfIconData.hwnd = Me.hwnd
  nfIconData.uID = Me.Icon
  nfIconData.uFlags = nif_icon Or NIF_MESSAGE Or NIF_TIP
  nfIconData.uCallbackmessage = WM_MOUSEMOVE
  nfIconData.hIcon = Me.Icon.Handle
  nfIconData.szTip = "System Tray Example" & vbNullChar
  nfIconData.cbSize = Len(nfIconData)
  Shell_NotifyIcon NIM_ADD, nfIconData
End Sub

Private Sub command2_Click()
  Call Shell_NotifyIcon(NIM_DELETE, nfIconData)
End Sub

Private Sub command3_Click()
  ShowWindow Me.hwnd, SW_HIDE
End Sub

Private Sub command4_Click()
  Unload Me
End Sub

Private Sub Command5_Click()
  Me.Visible = False
End Sub

Private Sub move_Click()
  Call Shell_NotifyIcon(NIM_DELETE, nfIconData)
End Sub

Private Sub show_Click()
  Me.Visible = True
End Sub

Private Sub exit_Click()
  Unload Me
End Sub





[解决办法]
这也算可用,那你对可用的要求也太低了.竟然拿X坐标来推算消息编号!同学啊,夸张点说,不能只要不导致VB异常中止的代码就算是可用的吧.
[解决办法]
http://zhidao.baidu.com/question/99675057.html
[解决办法]
帮顶一下。。。。。。。
[解决办法]
关键在于这一句:
nfIconData.uCallbackmessage = WM_MOUSEMOVE
一般情况下,这里不用 WM_MOUSEMOVE,而是自定义一个新的消息类型,比如9999,或者WM_USER + 100之类的。
然后自己写一个WindowsProc函数拦截这个消息,根据lPara的值判断是左击还是右击了图标。



楼主这个写法取巧了,他省去了自己写WindowsProc函数,而是在单机图标时扔给窗体一个WM_MOUSEMOVE消息,由窗体默认的WindowsProc过程拦截处理这个消息。
窗体接收到 WM_MOUSEMOVE消息后,会触发Form_mousemove事件。这时候估计是把lPara参数转换成了mousemove事件的X参数。API传递的都是像素值,而VB默认使用缇,所以应该是X=lPara*Screen.TwipsPerPixelX。
所以,在Form_mousemove事件中,X/Screen.TwipsPerPixelX就还原成了原来的lPara参数,即WM_LBUTTONUP或WM_RBUTTONUP

猜的,大约是这样吧。

热点排行