cPopupMenu.cls
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:3k
源码类别:

输入法编程

开发平台:

Visual C++

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cPopupMenu"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '类的名称为 cPopupMenu
  15. Option Explicit
  16. Private Type POINT
  17.     x As Long
  18.     y As Long
  19. End Type
  20. '
  21. Private Const MF_ENABLED = &H0&
  22. Private Const MF_SEPARATOR = &H800&
  23. Private Const MF_STRING = &H0&
  24. Private Const TPM_RIGHTBUTTON = &H2&
  25. Private Const TPM_LEFTALIGN = &H0&
  26. Private Const TPM_NONOTIFY = &H80&
  27. Private Const TPM_RETURNCMD = &H100& '要求菜单返回所选项
  28. Private Declare Function CreatePopupMenu Lib "user32" () As Long
  29. Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal sCaption As String) As Long
  30. Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, nIgnored As Long) As Long
  31. Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
  32. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINT) As Long
  33. Private Declare Function GetForegroundWindow Lib "user32" () As Long
  34. Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
  35. Private mSelMenuString As String
  36. Private mSelID As Long
  37. '得到所选择的菜单的字串
  38. Public Property Get SelMenuString() As String
  39.     SelMenuString = mSelMenuString
  40. End Property
  41. Public Property Get SelID() As String
  42.     SelID = mSelID
  43. End Property
  44. '返回所选菜单项
  45. Public Function Popup(ParamArray param()) As Long
  46.     Dim iMenu As Long, hMenu As Long, nMenus As Long
  47.     Dim p As POINT, ss As String, flag As Integer
  48.     GetCursorPos p
  49.     hMenu = CreatePopupMenu()
  50.     nMenus = 1 + UBound(param)
  51.     For iMenu = 1 To nMenus
  52.         If Trim$(CStr(param(iMenu - 1))) = "-" Then
  53.             AppendMenu hMenu, MF_SEPARATOR, iMenu, ""   '其中第三个参数iMenu供返回时使用
  54.         Else
  55.             ss = CStr(param(iMenu - 1))
  56.             flag = Val(ss)
  57.             
  58.             If (flag <> 0) Then ss = Mid(ss, Len(Str(flag)))
  59.             
  60.             AppendMenu hMenu, flag, iMenu, ss
  61.         End If
  62.     Next iMenu
  63.     iMenu = TrackPopupMenu(hMenu, TPM_RIGHTBUTTON + TPM_LEFTALIGN + TPM_NONOTIFY + TPM_RETURNCMD, p.x, p.y, 0, GetForegroundWindow(), 0)
  64.     Dim result As Long
  65.     Dim buffer As String
  66.     Const MF_BYPOSITION = &H400&
  67.     '得到菜单的选择字符串
  68.     buffer = Space(255)
  69.     result = GetMenuString(hMenu, (iMenu - 1), buffer, Len(buffer), MF_BYPOSITION)
  70.     
  71.     mSelMenuString = Trim(buffer)
  72.     mSelID = iMenu
  73.     
  74.     DestroyMenu hMenu
  75.     
  76.     Popup = iMenu
  77. End Function