cODMenus.cls
上传用户:davilee3
上传日期:2015-04-22
资源大小:986k
文件大小:8k
源码类别:

浏览器

开发平台:

Visual Basic

  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 = "cODMenus"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '----------------------------------------------------
  15. 'cODMenus
  16. '自画菜单总处理
  17. '2005-3-14  可以拥有多个 cImageList,使用中方便删除
  18. '----------------------------------------------------
  19. '8/5/2005   :修改了 RstMenu中的    TempCSM.Text.. 赋值
  20. Option Explicit
  21. Private mCSMenuCols As Collection
  22. Private Const m_def_key$ = "def"
  23. 'Public SMenus As New CCSMenu '菜单集合
  24. 'Public IcoImgList As  ImageList '菜单图标的ImageList
  25. Private mIcoImgList As cImageList  '菜单图标的ImageList
  26. Private mIconImgListZZ As Collection    '菜单图标的ImageList集合
  27. '整体添加图标
  28. Public Sub IniImageList(vBmp&, cx&, cy&, Optional vKey As String = m_def_key)
  29. Set mIcoImgList = GetImgLstObj2(vKey, False)     ' New cImageList
  30. mIcoImgList.LoadImageList_Object vBmp, cx, cy
  31. End Sub
  32. Public Function GetImgLstObj(Optional vKey$ = m_def_key) As cImageList
  33. On Error Resume Next
  34. Set GetImgLstObj = Nothing
  35. Set GetImgLstObj = mIconImgListZZ(vKey)
  36. End Function
  37. Public Function GetImgLstObj2(Optional vKey$ = m_def_key, Optional vCreateDef As Boolean = True) As cImageList
  38. Dim rtn As cImageList
  39. Set rtn = GetImgLstObj(vKey)
  40. If rtn Is Nothing Then
  41.     Set rtn = New cImageList
  42.     If vCreateDef Then
  43.         rtn.Create 16, 16
  44.     End If
  45.     mIconImgListZZ.Add rtn, vKey
  46. End If
  47. Set GetImgLstObj2 = rtn
  48. End Function
  49. Public Function RemoveImgLstObj(vKey$) As Boolean
  50. On Error Resume Next
  51. Err.Clear
  52. mIconImgListZZ.Remove vKey
  53. RemoveImgLstObj = (Err.Number = 0)
  54. End Function
  55. 'Public Function GetImgLstObj() As cImageList
  56. 'Set GetImgLstObj = mIcoImgList
  57. 'End Function
  58. Public Sub On_WM_MEASUREITEM(ByVal lParam&)
  59. Dim TempMIS As MEASUREITEMSTRUCT
  60. Dim tCanExit As Boolean
  61. Dim tCol As CCSMenu ' Collection
  62. Dim pSM As ClsSMenu
  63. CopyMemory TempMIS, ByVal lParam, Len(TempMIS)
  64. tCanExit = False
  65. For Each tCol In mCSMenuCols
  66.     If tCol.hMenu = TempMIS.itemData Then
  67.         For Each pSM In tCol
  68.             If pSM.MeID = TempMIS.itemID Then
  69.                 pSM.SetSize lParam
  70.                 tCanExit = True
  71.                 Exit For
  72.             End If
  73.         Next pSM
  74.     End If
  75.     If tCanExit Then Exit For
  76. Next tCol
  77. End Sub
  78. Public Sub On_WM_DRAWITEM(ByVal lParam&)
  79. Dim TempDIS As DRAWITEMSTRUCT
  80. Dim tCanExit As Boolean
  81. Dim tCol As CCSMenu  ' Collection
  82. Dim pSM As ClsSMenu
  83. CopyMemory TempDIS, ByVal lParam, Len(TempDIS)
  84. tCanExit = False
  85. For Each tCol In mCSMenuCols
  86.     If tCol.hMenu = TempDIS.hwndItem Then
  87.         For Each pSM In tCol
  88.             If pSM.MeID = TempDIS.itemID Then
  89.                 pSM.MeDraw lParam
  90.                 tCanExit = True
  91.                 Exit For
  92.             End If
  93.         Next pSM
  94.     End If
  95.     If tCanExit Then Exit For
  96. Next tCol
  97. End Sub
  98. '注册菜单
  99. Public Function RstMenu(MenuUpID As Long, MenuID As Long, _
  100.     Optional Key As String, _
  101.     Optional ByVal IcoIndex As Variant, _
  102.     Optional ByVal IcoSelIndex As Variant = -1, _
  103.     Optional ByVal IcoDisIndex As Variant = -1, _
  104.     Optional ByPosition As Long = 1, _
  105.     Optional Tag$, Optional vILstKey$ = m_def_key _
  106.     ) As ClsSMenu
  107.     
  108.     
  109.     Dim TempCSM As ClsSMenu
  110.     Dim TempMII As MENUITEMINFO
  111.     Dim StrByt(0 To 256) As Byte
  112.     
  113.     With TempMII
  114.         .cbSize = Len(TempMII) '结构大小为44字节
  115.         .fMask = MIIM_ID Or MIIM_STATE Or MIIM_TYPE Or MIIM_DATA '要取得的数据项目
  116.         .dwTypeData = VarPtr(StrByt(0)) '菜单文字存储地址
  117.         .cch = UBound(StrByt) '菜单文字长度
  118.     End With
  119.     
  120.     '如果返回0(不成功)则退出
  121.     If GetMenuItemInfo(MenuUpID, MenuID, ByPosition, TempMII) = 0 Then Exit Function
  122.     'Set TempCSM = SMenus.Add(key)  '添加项目
  123. '    Set TempCSM = New ClsSMenu
  124. '    GetCols(colKey).Add TempCSM ',    Key
  125.     Set TempCSM = GetCols(MenuUpID).Add(Key)
  126.     TempCSM.Tag = Tag
  127.     Set TempCSM.IconList = GetImgLstObj2(vILstKey) ' mIcoImgList
  128.     
  129. '    TempCSM.IcoIndex = IcoImgList.ListImages(IcoIndex).index  '给图标索引赋值
  130. '    If IcoSelIndex < 0 Then
  131. '        TempCSM.IcoSelIndex = TempCSM.IcoIndex ' IcoIndex
  132. '    Else
  133. '        TempCSM.IcoSelIndex = IcoImgList.ListImages(IcoSelIndex).index
  134. '    End If
  135. '    If IcoDisIndex < 0 Then
  136. '        TempCSM.IcoDisableIndex = TempCSM.IcoIndex 'IcoIndex
  137. '    Else
  138. '        TempCSM.IcoDisableIndex = IcoImgList.ListImages(IcoDisIndex).index
  139. '    End If
  140.     TempCSM.IcoIndex = IcoIndex  '给图标索引赋值
  141.     If IcoSelIndex < 0 Then
  142.         TempCSM.IcoSelIndex = TempCSM.IcoIndex ' IcoIndex
  143.     Else
  144.         TempCSM.IcoSelIndex = IcoSelIndex
  145.     End If
  146.     If IcoDisIndex < 0 Then
  147.         TempCSM.IcoDisableIndex = TempCSM.IcoIndex 'IcoIndex
  148.     Else
  149.         TempCSM.IcoDisableIndex = IcoDisIndex
  150.     End If
  151.     
  152.     
  153.     
  154.     TempCSM.MeUpID = MenuUpID '菜单上级句柄
  155.     TempCSM.MeID = TempMII.wID '菜单句柄
  156.     'TempCSM.Text = StrConv(LeftB(StrByt, TempMII.cch), vbUnicode) '菜单文字
  157.     TempCSM.Text = LeftB(StrByt, TempMII.cch) '菜单文字
  158.     If TempMII.fState And MFS_CHECKED Then TempCSM.Check = True 'Check属性
  159.     If TempMII.fState And MFT_RADIOCHECK Then TempCSM.Radio = True 'Radio属性
  160.     If TempMII.fState And (MFS_DISABLED Or MFS_GRAYED) Then TempCSM.Enabled = False 'Enabled属性
  161.     
  162.     With TempMII
  163.         .cbSize = Len(TempMII) '结构大小为44字节
  164.         .fMask = MIIM_TYPE Or MIIM_DATA  '要改变的数据项目
  165.         .dwTypeData = VarPtr(StrByt(0)) '菜单文字存储地址
  166.         .fType = .fType Or MFT_OWNERDRAW '改为 自画 属性
  167.         .dwItemData = MenuUpID
  168.     End With
  169.     Call SetMenuItemInfo(MenuUpID, MenuID, ByPosition, TempMII)     '设置菜单
  170.     
  171.     Set RstMenu = TempCSM '返回值
  172.     Set TempCSM = Nothing
  173.     
  174. End Function
  175. 'Private Function GetCols(Key$) As Collection
  176. 'On Error Resume Next
  177. 'Dim rtn As Collection
  178. 'If Key = "" Then
  179. '    Key = m_def_key
  180. 'End If
  181. '
  182. '    Err.Clear
  183. '    Set rtn = mCSMenuCols(Key)
  184. '    If Err.Number <> 0 Then
  185. '        Set rtn = New Collection
  186. '        mCSMenuCols.Add rtn, Key
  187. '    End If
  188. '
  189. 'Set GetCols = rtn
  190. 'End Function
  191. Private Function GetCols(vHmnu&) As CCSMenu
  192. Dim rtn As CCSMenu
  193. For Each rtn In mCSMenuCols
  194.     If rtn.hMenu = vHmnu Then
  195.         Exit For
  196.     End If
  197. Next rtn
  198. If rtn Is Nothing Then
  199.     Set rtn = New CCSMenu
  200.     rtn.hMenu = vHmnu
  201.     mCSMenuCols.Add rtn
  202. Else
  203.     If rtn.hMenu <> vHmnu Then
  204.         Set rtn = New CCSMenu
  205.         rtn.hMenu = vHmnu
  206.         mCSMenuCols.Add rtn
  207.     End If
  208. End If
  209.     
  210. Set GetCols = rtn
  211. End Function
  212. '移除相同tag的菜单
  213. Public Sub RemoveMulODMenu(vTag As String)
  214. Dim tCol As CCSMenu
  215. Dim tODm As ClsSMenu
  216. Dim tcnt&, i&
  217. For Each tCol In mCSMenuCols
  218.     tcnt = tCol.Count
  219.     For i = tcnt To 1 Step -1
  220.         Set tODm = tCol(i)
  221.         If tODm.Tag = vTag Then
  222.             tCol.Remove i
  223.         End If
  224.     Next i
  225. Next tCol
  226. End Sub
  227. '移除同一菜单下的项目
  228. Public Sub RemoveCol(vHmnu&) '(Key$)
  229. On Error Resume Next
  230. Dim tCol As CCSMenu
  231. Dim tcnt&, i&
  232. tcnt = mCSMenuCols.Count
  233. For i = 1 To tcnt
  234.     Set tCol = mCSMenuCols(i)
  235.     If tCol.hMenu = vHmnu Then
  236.         Call mCSMenuCols.Remove(i)
  237.         Exit For
  238.     End If
  239. Next i
  240. 'mCSMenuCols.Remove Key
  241. End Sub
  242. Private Sub Class_Initialize()
  243. Set mCSMenuCols = New Collection
  244. Set mIconImgListZZ = New Collection
  245. End Sub
  246. Private Sub Class_Terminate()
  247. Set mCSMenuCols = Nothing
  248. Set mIconImgListZZ = Nothing
  249. End Sub