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

浏览器

开发平台:

Visual Basic

  1. Attribute VB_Name = "mDrawMenu"
  2. Option Explicit
  3. '###############################################
  4. 'Public MeOldWndProc As Long '旧的窗体消息处理程序地址
  5. Public SMenus As New CCSMenu '菜单集合
  6. Public IcoImgList As ImageList '菜单图标的ImageList
  7. '注册菜单
  8. Public Function RstMenu(MenuUpID As Long, MenuID As Long, _
  9.     Optional Key As String, _
  10.     Optional ByVal IcoIndex As Variant, _
  11.     Optional ByVal IcoSelIndex As Variant = -1, _
  12.     Optional ByVal IcoDisIndex As Variant = -1, _
  13.     Optional ByPosition As Long = 1, _
  14.     Optional Tag$ _
  15.     ) As ClsSMenu
  16.     
  17.     
  18.     Dim TempCSM As ClsSMenu
  19.     Dim TempMII As MENUITEMINFO
  20.     Dim StrByt(0 To 256) As Byte
  21.     
  22.     TempMII.cbSize = 44 '结构大小为44字节
  23.     TempMII.fMask = MIIM_ID Or MIIM_STATE Or MIIM_TYPE Or MIIM_DATA '要取得的数据项目
  24.     TempMII.dwTypeData = VarPtr(StrByt(0)) '菜单文字存储地址
  25.     TempMII.cch = UBound(StrByt) '菜单文字长度
  26.     
  27.     '如果返回0(不成功)则退出
  28.     If GetMenuItemInfo(MenuUpID, MenuID, ByPosition, TempMII) = 0 Then Exit Function
  29.     
  30.     Set TempCSM = SMenus.Add(Key)  '添加项目
  31.     TempCSM.Tag = Tag
  32.     
  33.     TempCSM.IcoIndex = IcoImgList.ListImages(IcoIndex).index  '给图标索引赋值
  34.     If IcoSelIndex < 0 Then
  35.         TempCSM.IcoSelIndex = TempCSM.IcoIndex ' IcoIndex
  36.     Else
  37.         TempCSM.IcoSelIndex = IcoImgList.ListImages(IcoSelIndex).index
  38.     End If
  39.     If IcoDisIndex < 0 Then
  40.         TempCSM.IcoDisableIndex = TempCSM.IcoIndex 'IcoIndex
  41.     Else
  42.         TempCSM.IcoDisableIndex = IcoImgList.ListImages(IcoDisIndex).index
  43.     End If
  44.     
  45.     TempCSM.MeUpID = MenuUpID '菜单上级句柄
  46.     TempCSM.MeID = TempMII.wID '菜单句柄
  47.     TempCSM.Text = StrConv(LeftB(StrByt, TempMII.cch), vbUnicode) '菜单文字
  48.     If TempMII.fState And MFS_CHECKED Then TempCSM.Check = True 'Check属性
  49.     If TempMII.fState And MFT_RADIOCHECK Then TempCSM.Radio = True 'Radio属性
  50.     If TempMII.fState And (MFS_DISABLED Or MFS_GRAYED) Then TempCSM.Enabled = False 'Enabled属性
  51.     
  52.     TempMII.cbSize = 44 '结构大小为44字节
  53.     TempMII.fMask = MIIM_TYPE '要改变的数据项目
  54.     TempMII.dwTypeData = VarPtr(StrByt(0)) '菜单文字存储地址
  55.     TempMII.fType = TempMII.fType Or MFT_OWNERDRAW '改为 自画 属性
  56.     Call SetMenuItemInfo(MenuUpID, MenuID, ByPosition, TempMII)     '设置菜单
  57.     
  58.     Set RstMenu = TempCSM '返回值
  59.     Set TempCSM = Nothing
  60.     
  61. End Function
  62. '确定ImageList中有没有Index指定的图片
  63. Public Function ImgListMapTrue(pImgList As ImageList, index As Long) As Boolean
  64.     If pImgList Is Nothing Then ImgListMapTrue = False: Exit Function
  65.     If index < 1 Or index > pImgList.ListImages.Count Then ImgListMapTrue = False: Exit Function
  66.     ImgListMapTrue = True
  67. End Function
  68. '绘制网格
  69. Public Sub FillWG(hdc As Long, _
  70.         X1 As Long, Y1 As Long, _
  71.         X2 As Long, Y2 As Long, _
  72.         Mode As Integer, C As Long)
  73.     Dim i As Integer, j As Integer
  74.     Dim I1 As Integer, J1 As Integer
  75.     
  76.     If Mode < 0 Then '25%
  77.         For i = Y1 To Y2 Step 2
  78.             For j = X1 To X2 Step 4
  79.                 For I1 = 0 To 1
  80.                     For J1 = 0 To 3
  81.                         If i + I1 <= Y2 And j + J1 <= X2 Then
  82.                             If ((I1 = 0 And J1 = 0) Or (I1 = 1 And J1 = 2)) Then
  83.                                 SetPixelV hdc, j + J1, (i + I1), C
  84.                                 
  85.                             Else
  86.                             End If
  87.                         End If
  88.                         
  89.                     Next J1
  90.                     
  91.                 Next I1
  92.                 
  93.             Next j
  94.             
  95.         Next i
  96.         
  97.     ElseIf Mode = 0 Then '50%
  98.         For i = Y1 To Y2
  99.             For j = X1 To X2
  100.                 If (i - Y1 + j - X1) And 1 Then
  101.                 Else
  102.                     SetPixelV hdc, j, i, C
  103.                     
  104.                 End If
  105.                 
  106.             Next j
  107.             
  108.         Next i
  109.         
  110.     Else '75%
  111.         For i = Y1 To Y2 Step 2
  112.             For j = X1 To X2 Step 4
  113.                 For I1 = 0 To 1
  114.                     For J1 = 0 To 3
  115.                         If i + I1 <= Y2 And j + J1 <= X2 Then
  116.                             If ((I1 = 1 And J1 = 1) Or (I1 = 0 And J1 = 3)) And (i + I1 <= Y2 And j + J1 <= X2) Then
  117.                             Else
  118.                                 SetPixelV hdc, j + J1, (i + I1), C
  119.                                 
  120.                             End If
  121.                         End If
  122.                         
  123.                     Next J1
  124.                     
  125.                 Next I1
  126.                 
  127.             Next j
  128.             
  129.         Next i
  130.         
  131.     End If
  132.     
  133. End Sub