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

浏览器

开发平台:

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 = "ClsSMenu"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
  15. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  16. '---------------------------------------------------------------------------------------
  17. ' Module    : ClsSMenu
  18. ' DateTime  : 2005-??-?? ??:??
  19. ' Author    : Lingll
  20. ' Purpose   :
  21. '---------------------------------------------------------------------------------------
  22. '8/5/2005   :修改了text的传入方式,为asci方式(非unicode)
  23. Option Explicit
  24. Public MeUpID As Long
  25. Public MeID As Long
  26. Public IconList As cImageList ' MSComctlLib.ImageList
  27. '普通状态
  28. Public IcoIndex As Long
  29. '选择状态
  30. Public IcoSelIndex As Long
  31. '不可用状态
  32. Public IcoDisableIndex As Long
  33. Private MeKey As String
  34. Private MeText As String
  35. Private MeChk As Boolean
  36. Private MeRadio As Boolean
  37. Private MeEn As Boolean
  38. Private MeView As Boolean
  39. Private MeSelect As Boolean
  40. Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As _
  41.     Long, ByVal lpStr As Long, ByVal nCount As Long, lpRect As RECT, ByVal _
  42.     wFormat As Long) As Long
  43. Private Declare Function SystemParametersInfo Lib "user32" Alias _
  44.     "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam _
  45.     As NONCLIENTMETRICS, ByVal fuWinIni As Long) As Long
  46. Private Declare Function CreateFontIndirect Lib "gdi32" Alias _
  47.     "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
  48. Private Const LF_FACESIZE As Long = 32
  49. Private Const SPI_GETNONCLIENTMETRICS As Long = 41
  50. Private Type LOGFONT
  51.     lfHeight As Long
  52.     lfWidth As Long
  53.     lfEscapement As Long
  54.     lfOrientation As Long
  55.     lfWeight As Long
  56.     lfItalic As Byte
  57.     lfUnderline As Byte
  58.     lfStrikeOut As Byte
  59.     lfCharSet As Byte
  60.     lfOutPrecision As Byte
  61.     lfClipPrecision As Byte
  62.     lfQuality As Byte
  63.     lfPitchAndFamily As Byte
  64.     lfFaceName(1 To LF_FACESIZE) As Byte
  65. End Type
  66. Private Type NONCLIENTMETRICS
  67.     cbSize As Long
  68.     iBorderWidth As Long
  69.     iScrollWidth As Long
  70.     iScrollHeight As Long
  71.     iCaptionWidth As Long
  72.     iCaptionHeight As Long
  73.     lfCaptionFont As LOGFONT
  74.     iSMCaptionWidth As Long
  75.     iSMCaptionHeight As Long
  76.     lfSMCaptionFont As LOGFONT
  77.     iMenuWidth As Long
  78.     iMenuHeight As Long
  79.     lfMenuFont As LOGFONT
  80.     lfStatusFont As LOGFONT
  81.     lfMessageFont As LOGFONT
  82. End Type
  83. Public Tag As String
  84. '菜单Key
  85. Public Property Let Key(SetStr As String)
  86.     MeKey = SetStr
  87.     
  88. End Property
  89. Public Property Get Key() As String
  90.     Key = MeKey
  91.     
  92. End Property
  93. '菜单文字
  94. '仅传进asci字符
  95. Public Property Let Text(TextStr As String)
  96.     MeText = TextStr
  97.     
  98. End Property
  99. 'Public Property Get Text() As String
  100. '    Text = MeText
  101. '
  102. 'End Property
  103. '选中
  104. Public Property Let Check(SetBol As Boolean)
  105.     Dim TempMII As MENUITEMINFO
  106.     
  107.     MeChk = SetBol
  108.     
  109.     TempMII.cbSize = 44
  110.     TempMII.fMask = MIIM_STATE
  111.     Call GetMenuItemInfo(MeUpID, MeID, 0, TempMII)
  112.     'Debug.Print "&H"; Hex$(TempMII.fState)
  113.     
  114.     TempMII.fMask = MIIM_STATE
  115.     TempMII.fState = TempMII.fState And (Not MFS_CHECKED) _
  116.             Or (MFS_CHECKED And SetBol)
  117.     Call SetMenuItemInfo(MeUpID, MeID, 0, TempMII)
  118.     'Debug.Print "&H"; Hex$(TempMII.fState)
  119.     
  120. End Property
  121. Public Property Get Check() As Boolean
  122.     Check = MeChk
  123.     
  124. End Property
  125. '选中
  126. Public Property Let Radio(SetBol As Boolean)
  127.     Dim TempMII As MENUITEMINFO
  128.     Dim TextByt(0 To 256) As Byte
  129.     
  130.     MeRadio = SetBol
  131.     
  132.     TempMII.cbSize = 44
  133.     TempMII.dwTypeData = VarPtr(TextByt(0))
  134.     TempMII.fMask = MIIM_TYPE
  135.     Call GetMenuItemInfo(MeUpID, MeID, 0, TempMII)
  136.     'Debug.Print "&H"; Hex$(TempMII.fType)
  137.     
  138.     TempMII.fMask = MIIM_TYPE
  139.     TempMII.fType = TempMII.fType And (Not MFT_RADIOCHECK) _
  140.             Or (MFT_RADIOCHECK And SetBol)
  141.     Call SetMenuItemInfo(MeUpID, MeID, 0, TempMII)
  142.     'Debug.Print "&H"; Hex$(TempMII.fType)
  143.     
  144. End Property
  145. Public Property Get Radio() As Boolean
  146.     Radio = MeRadio
  147.     
  148. End Property
  149. '可用
  150. Public Property Let Enabled(SetBol As Boolean)
  151.     Dim TempMII As MENUITEMINFO
  152.     
  153.     MeEn = SetBol
  154.     
  155.     TempMII.cbSize = 44
  156.     TempMII.fMask = MIIM_STATE
  157.     Call GetMenuItemInfo(MeUpID, MeID, 0, TempMII)
  158.     'Debug.Print "&H"; Hex$(TempMII.fState)
  159.     
  160.     TempMII.fMask = MIIM_STATE
  161.     TempMII.fState = TempMII.fState And (Not (MFS_GRAYED Or MF_DISABLED)) _
  162.             Or ((MFS_GRAYED Or MF_DISABLED) And (SetBol = False))
  163.     Call SetMenuItemInfo(MeUpID, MeID, 0, TempMII)
  164.     'Debug.Print "&H"; Hex$(TempMII.fState)
  165.     
  166. End Property
  167. Public Property Get Enabled() As Boolean
  168.     Enabled = MeEn
  169.     
  170. End Property
  171. '可见
  172. Public Property Let Visible(SetBol As Boolean)
  173.     MeView = SetBol
  174.     
  175. End Property
  176. Public Property Get Visible() As Boolean
  177.     Visible = MeView
  178.     
  179. End Property
  180. '选择时
  181. Public Property Get MenuSelect() As Boolean
  182.     MenuSelect = MeSelect
  183.     
  184. End Property
  185. Private Sub Class_Initialize()
  186.     MeEn = True
  187.     MeView = True
  188. End Sub
  189. Private Sub Class_Terminate()
  190.     '
  191. End Sub
  192. '设置大小
  193. Public Sub SetSize(ByVal lParam As Long)
  194.     Dim hDrawDC As Long
  195.     Dim MeMIS As MEASUREITEMSTRUCT
  196.     Dim lpSize As Size
  197.     
  198.     Dim nm As NONCLIENTMETRICS
  199.     Dim oldfont As Long, nFont As Long
  200.         
  201.     CopyMemory MeMIS, ByVal lParam, Len(MeMIS) '取值
  202.     
  203.     '获得系统默认的菜单字体
  204.     nm.cbSize = Len(nm)
  205.     Call SystemParametersInfo(SPI_GETNONCLIENTMETRICS, nm.cbSize, nm, 0)
  206.     nFont = CreateFontIndirect(nm.lfMenuFont)
  207.     
  208.     
  209.     'hDrawDC = GetDC(gHW) '(frmDrawMenu.hwnd)   '取得hDC
  210.     hDrawDC = GetDC(0)
  211.     
  212.     oldfont = SelectObject(hDrawDC, nFont)
  213.     
  214.     GetTextExtentPoint32 hDrawDC, StrPtr(MeText), LenB(MeText), lpSize   '取得文字大小
  215.     
  216.     'lpSize.cx = trc.Right - trc.Left
  217.     MeMIS.itemWidth = 19 + lpSize.cx + 12 + 8 - 12
  218.     '              图标宽度 文字宽度    右箭头 默认增量
  219.     If nm.iMenuHeight < 19 Then
  220.         MeMIS.itemHeight = 19 '图标高度
  221.     Else
  222.         MeMIS.itemHeight = nm.iMenuHeight
  223.     End If
  224.     
  225.     SelectObject hDrawDC, oldfont
  226.     
  227.     DeleteObject nFont
  228.     
  229.     'Call ReleaseDC(gHW,  hDrawDC) ' (frmDrawMenu.hwnd, hDrawDC) '释放hDC
  230.     Call ReleaseDC(0, hDrawDC)
  231.     
  232.     CopyMemory ByVal lParam, MeMIS, Len(MeMIS) '赋值
  233.     
  234. End Sub
  235. '绘制菜单
  236. Public Sub MeDraw(ByVal lParam As Long)
  237.     Dim MeDIS As DRAWITEMSTRUCT
  238.     Dim TemphBr As Long
  239.     Dim TempRect As RECT
  240.     
  241.     Dim tTextColor As Long
  242.     
  243.     
  244.     Dim tDrawIconIndex As Long
  245.     
  246.     CopyMemory MeDIS, ByVal lParam, Len(MeDIS) '取值
  247.     'Debug.Print "DC:" & MeDIS.hDC
  248.     SetBkMode MeDIS.hdc, TRANSPARENT '设置背景透明
  249.     
  250.     '取得绘制属性
  251.     MeSelect = MeDIS.itemState And ODS_SELECTED
  252.     MeChk = MeDIS.itemState And ODS_CHECKED
  253.     MeEn = ((MeDIS.itemState And (ODS_GRAYED Or ODS_DISABLED)) = False)
  254.     
  255.     '图标的RECT
  256.     Dim IcoRect As RECT
  257.     IcoRect = MeDIS.rcItem
  258.     IcoRect.Right = IcoRect.Left + 19
  259.     
  260.     '文字的RECT
  261.     Dim TxtRect As RECT
  262.     TxtRect = MeDIS.rcItem
  263.     TxtRect.Left = TxtRect.Left + 21
  264.     
  265.     '重画背景
  266.     TemphBr = CreateSolidBrush(GetSysColor(COLOR_MENU))
  267.     FillRect MeDIS.hdc, MeDIS.rcItem, TemphBr
  268.     Call DeleteObject(TemphBr)
  269.     
  270.     '绘制选择时的填充矩形
  271.     If MeSelect Then
  272.         TempRect = TxtRect
  273.         TempRect.Left = TempRect.Left - 1 '  20
  274.         TemphBr = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT))
  275.         FillRect MeDIS.hdc, TempRect, TemphBr
  276.         Call DeleteObject(TemphBr)
  277.         
  278.     Else
  279.         '
  280.     End If
  281.     
  282.     '绘制图标边框以及网格背景
  283.     If MeSelect Then
  284.         If MeChk Then
  285.             DrawEdge MeDIS.hdc, IcoRect, BDR_SUNKENOUTER, BF_RECT
  286.         Else
  287.             DrawEdge MeDIS.hdc, IcoRect, BDR_RAISEDINNER, BF_RECT
  288.         End If
  289.     Else
  290.         If MeChk Then
  291.             FillWG MeDIS.hdc, _
  292.                     IcoRect.Left, IcoRect.Top, _
  293.                     IcoRect.Right - 1, IcoRect.Bottom - 1, _
  294.                     0, &HFFFFFF
  295.             DrawEdge MeDIS.hdc, IcoRect, BDR_SUNKENOUTER, BF_RECT
  296.         Else
  297.             '
  298.         End If
  299.     End If
  300.     
  301.     '绘制图标
  302.     If MeEn Then
  303.         If MeSelect Then
  304.             tDrawIconIndex = IcoSelIndex
  305.         Else
  306.             tDrawIconIndex = IcoIndex
  307.         End If
  308.     Else
  309.         tDrawIconIndex = IcoDisableIndex
  310.     End If
  311.     
  312. '    If ImgListMapTrue(IconList, tDrawIconIndex) Then
  313. '        IconList.ListImages(tDrawIconIndex).Draw MeDIS.hdc, _
  314. '                (IcoRect.Left + 1) * Screen.TwipsPerPixelX, _
  315. '                (IcoRect.Top + 1) * Screen.TwipsPerPixelY, _
  316. '                imlTransparent
  317. '
  318. '    End If
  319.     IconList.Draw MeDIS.hdc, tDrawIconIndex, IcoRect.Left + 1, IcoRect.Top + 1
  320.     
  321.     '绘制文字
  322.     If MeEn Then
  323.         If MeSelect Then
  324.             tTextColor = GetSysColor(COLOR_HIGHLIGHTTEXT)
  325.         Else
  326.             tTextColor = GetSysColor(COLOR_MENUTEXT)
  327.         End If
  328.         Call SetTextColor(MeDIS.hdc, tTextColor)
  329.         Call DrawText(MeDIS.hdc, StrPtr(MeText), -1, TxtRect, DT_LEFT Or DT_SINGLELINE Or DT_VCENTER)
  330.     Else
  331.         If MeSelect Then
  332.             tTextColor = GetSysColor(COLOR_GRAYTEXT)
  333.             Call SetTextColor(MeDIS.hdc, tTextColor)
  334.             Call DrawText(MeDIS.hdc, StrPtr(MeText), -1, TxtRect, DT_LEFT Or DT_SINGLELINE Or DT_VCENTER)
  335.         Else
  336.             tTextColor = GetSysColor(COLOR_BTNHIGHLIGHT)
  337.             Call SetTextColor(MeDIS.hdc, tTextColor)
  338.             Call DrawText(MeDIS.hdc, StrPtr(MeText), -1, TxtRect, DT_LEFT Or DT_SINGLELINE Or DT_VCENTER)
  339.             
  340.             With TxtRect
  341.                 .Left = .Left - 1
  342.                 .Right = .Right - 1
  343.                 .Top = .Top - 1
  344.                 .Bottom = .Bottom - 1
  345.             End With
  346.                     
  347.             tTextColor = GetSysColor(COLOR_GRAYTEXT)
  348.             Call SetTextColor(MeDIS.hdc, tTextColor)
  349.             Call DrawText(MeDIS.hdc, StrPtr(MeText), -1, TxtRect, DT_LEFT Or DT_SINGLELINE Or DT_VCENTER)
  350.         End If
  351.     End If
  352.         
  353.     
  354.     'nCount=-1 为自动算长度
  355.     
  356. End Sub
  357. ''确定ImageList中有没有Index指定的图片
  358. 'Public Function ImgListMapTrue(pImgList As ImageList, index As Long) As Boolean
  359. '    If pImgList Is Nothing Then ImgListMapTrue = False: Exit Function
  360. '    If index < 1 Or index > pImgList.ListImages.Count Then ImgListMapTrue = False: Exit Function
  361. '    ImgListMapTrue = True
  362. 'End Function
  363. '绘制网格
  364. Public Sub FillWG(hdc As Long, _
  365.         X1 As Long, Y1 As Long, _
  366.         X2 As Long, Y2 As Long, _
  367.         Mode As Integer, C As Long)
  368.     Dim i As Integer, j As Integer
  369.     Dim I1 As Integer, J1 As Integer
  370.     
  371.     If Mode < 0 Then '25%
  372.         For i = Y1 To Y2 Step 2
  373.             For j = X1 To X2 Step 4
  374.                 For I1 = 0 To 1
  375.                     For J1 = 0 To 3
  376.                         If i + I1 <= Y2 And j + J1 <= X2 Then
  377.                             If ((I1 = 0 And J1 = 0) Or (I1 = 1 And J1 = 2)) Then
  378.                                 SetPixelV hdc, j + J1, (i + I1), C
  379.                                 
  380.                             Else
  381.                             End If
  382.                         End If
  383.                         
  384.                     Next J1
  385.                     
  386.                 Next I1
  387.                 
  388.             Next j
  389.             
  390.         Next i
  391.         
  392.     ElseIf Mode = 0 Then '50%
  393.         For i = Y1 To Y2
  394.             For j = X1 To X2
  395.                 If (i - Y1 + j - X1) And 1 Then
  396.                 Else
  397.                     SetPixelV hdc, j, i, C
  398.                     
  399.                 End If
  400.                 
  401.             Next j
  402.             
  403.         Next i
  404.         
  405.     Else '75%
  406.         For i = Y1 To Y2 Step 2
  407.             For j = X1 To X2 Step 4
  408.                 For I1 = 0 To 1
  409.                     For J1 = 0 To 3
  410.                         If i + I1 <= Y2 And j + J1 <= X2 Then
  411.                             If ((I1 = 1 And J1 = 1) Or (I1 = 0 And J1 = 3)) And (i + I1 <= Y2 And j + J1 <= X2) Then
  412.                             Else
  413.                                 SetPixelV hdc, j + J1, (i + I1), C
  414.                                 
  415.                             End If
  416.                         End If
  417.                         
  418.                     Next J1
  419.                     
  420.                 Next I1
  421.                 
  422.             Next j
  423.             
  424.         Next i
  425.         
  426.     End If
  427.     
  428. End Sub