home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 1_2002.ISO / Data / Zips / CODE_UPLOAD3740332000.psc / DynaMenu.ctl < prev    next >
Encoding:
Visual Basic user-defined control file  |  2000-03-02  |  8.6 KB  |  304 lines

  1. VERSION 5.00
  2. Begin VB.UserControl DynaMenu 
  3.    Appearance      =   0  'Flat
  4.    BackColor       =   &H80000005&
  5.    BorderStyle     =   1  'Fixed Single
  6.    ClientHeight    =   570
  7.    ClientLeft      =   0
  8.    ClientTop       =   0
  9.    ClientWidth     =   1560
  10.    InvisibleAtRuntime=   -1  'True
  11.    ScaleHeight     =   570
  12.    ScaleWidth      =   1560
  13.    ToolboxBitmap   =   "DynaMenu.ctx":0000
  14.    Begin VB.Timer Timer1 
  15.       Enabled         =   0   'False
  16.       Interval        =   1
  17.       Left            =   840
  18.       Top             =   0
  19.    End
  20.    Begin VB.PictureBox Picture1 
  21.       AutoSize        =   -1  'True
  22.       BorderStyle     =   0  'None
  23.       Height          =   450
  24.       Left            =   0
  25.       Picture         =   "DynaMenu.ctx":00FA
  26.       ScaleHeight     =   450
  27.       ScaleWidth      =   480
  28.       TabIndex        =   0
  29.       Top             =   0
  30.       Width           =   480
  31.    End
  32. End
  33. Attribute VB_Name = "DynaMenu"
  34. Attribute VB_GlobalNameSpace = False
  35. Attribute VB_Creatable = True
  36. Attribute VB_PredeclaredId = False
  37. Attribute VB_Exposed = True
  38. Option Explicit
  39.  
  40. Private m_objParentMenu As Menu
  41. Private m_objPopupMenu As Menu
  42. Private m_varChildMenuArray As Variant
  43. Private m_colMenus As CMenus
  44.  
  45. Private Const DEF_CAPTION As String = ""
  46.  
  47. #Const DEBUG_MODE = False
  48.  
  49. '*******************************************************************************
  50. '
  51. '-------------------------------------------------------------------------------
  52.  
  53. Private Sub UserControl_Initialize()
  54.     Set m_colMenus = New CMenus
  55.     Set m_colMenus.Parent = Me
  56. End Sub
  57.  
  58. Private Sub UserControl_Terminate()
  59.     Set m_colMenus.Parent = Nothing
  60.     Set m_colMenus = Nothing
  61. End Sub
  62.  
  63. '*******************************************************************************
  64. '
  65. '-------------------------------------------------------------------------------
  66.  
  67. Private Sub UserControl_Resize()
  68.     Picture1.Move 60, 60
  69.     UserControl.Width = Picture1.Width + 120
  70.     UserControl.Height = Picture1.Height + 120
  71. End Sub
  72.  
  73. '*******************************************************************************
  74. '
  75. '-------------------------------------------------------------------------------
  76.  
  77. Private Sub UserControl_InitProperties()
  78.     'TODO...
  79. End Sub
  80.  
  81. Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  82.     'TODO...
  83. End Sub
  84.  
  85. Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  86.     'TODO...
  87. End Sub
  88.  
  89. '*******************************************************************************
  90. '
  91. '-------------------------------------------------------------------------------
  92.  
  93. Public Property Get ParentMenu() As Variant
  94.     Set ParentMenu = m_objParentMenu
  95. End Property
  96. Public Property Set ParentMenu(vNewValue As Variant)
  97.     If TypeOf vNewValue Is Menu Then
  98.         Set m_objParentMenu = vNewValue
  99.     Else
  100.         Err.Raise vbObjectError, "DynaMenu::ParentMenu() [Set]", _
  101.             "DynaMenu::ParentMenu() [Set] - ParentMenu can only be set " & _
  102.             "to a VB Menu Object"
  103.     End If
  104.     
  105.     If IsMenu(GethMenu(m_objParentMenu)) = 0 Then
  106.         Timer1.Interval = 10
  107.         Timer1.Enabled = True
  108.     End If
  109.         
  110. End Property
  111.  
  112. Public Property Get PopupMenu() As Variant
  113.     Set PopupMenu = m_objPopupMenu
  114. End Property
  115. Public Property Set PopupMenu(vNewValue As Variant)
  116.     Set m_objPopupMenu = vNewValue
  117.     If TypeOf vNewValue Is Menu Then
  118.         Set m_objPopupMenu = vNewValue
  119.         On Error Resume Next
  120.         m_objPopupMenu.Visible = False
  121.     Else
  122.         Err.Raise vbObjectError, "DynaMenu::PopupMenu() [Set]", _
  123.             "DynaMenu::PopupMenu() [Set] - PopupMenu can only be set " & _
  124.             "to a VB Menu Object"
  125.     End If
  126.  
  127. End Property
  128.  
  129. Public Property Get ChildMenuArray() As Variant
  130.     Set ChildMenuArray = m_varChildMenuArray
  131. End Property
  132. Public Property Set ChildMenuArray(vNewValue As Variant)
  133.     Set m_varChildMenuArray = vNewValue
  134. End Property
  135.  
  136. '*******************************************************************************
  137. '
  138. '-------------------------------------------------------------------------------
  139.  
  140. Public Property Get Menu() As CMenus
  141.     Set Menu = m_colMenus
  142. End Property
  143.  
  144. '*******************************************************************************
  145. '
  146. '-------------------------------------------------------------------------------
  147.  
  148. Public Function ItemByMenuIndex(ByVal Index As Long) As CMenu
  149.  
  150.     On Error GoTo ErrorTrap
  151.     Dim obj As CMenu
  152. '    Set obj = mCol(m_varMenuItem(Index).Tag)
  153.     For Each obj In m_colMenus
  154.         If (obj.MenuItem.Index = Index) Then
  155.             Set ItemByMenuIndex = obj
  156.             Exit For
  157.         End If
  158.     Next
  159.     Set obj = Nothing
  160.     
  161.     If (ItemByMenuIndex Is Nothing) Then
  162.         MsgBox "No Menu Item found with MenuItemIndex=" & Index
  163.     End If
  164.     
  165. ErrorTrap:
  166. End Function
  167.  
  168. '*******************************************************************************
  169. '
  170. '-------------------------------------------------------------------------------
  171.  
  172. Public Sub Refresh()
  173.     DrawMenuBar hParentWnd
  174. End Sub
  175.  
  176. '*******************************************************************************
  177. '
  178. '-------------------------------------------------------------------------------
  179.  
  180. Friend Property Get hParentWnd() As Long
  181.     hParentWnd = UserControl.Parent.hwnd
  182. End Property
  183.  
  184. '*******************************************************************************
  185. '
  186. '-------------------------------------------------------------------------------
  187.  
  188. Private Sub Timer1_Timer()
  189.     
  190.     If IsMenu(GethMenu(m_objParentMenu)) = 0 Then Exit Sub
  191.     If IsMenu(GethMenu(m_objPopupMenu)) = 0 Then Exit Sub
  192.     
  193.     Timer1.Enabled = False
  194.  
  195.     Dim mnu As CMenu
  196.     For Each mnu In m_colMenus
  197.         If Len(mnu.ParentKey) = 0 Then
  198.             AddMenuObject mnu
  199.         End If
  200.     Next
  201. End Sub
  202.  
  203. Friend Sub AddMenuObject(Menu As CMenu)
  204.  
  205.     Dim hParentMenu As Long
  206.     If Len(Menu.ParentKey) > 0 Then
  207.         ' Belongs to SubMenu
  208.         Dim mnu As CMenu
  209.         Set mnu = m_colMenus(Menu.ParentKey)
  210.         hParentMenu = mnu.hPopupMenu
  211.         
  212.         'Increment  the parent's ChildCount property
  213.         mnu.ChildCount = mnu.ChildCount + 1
  214.         Set mnu = Nothing
  215.     
  216.     Else
  217.         ' Belongs to Parent Menu
  218.         If ParentMenu Is Nothing Then
  219.             hParentMenu = GetMenu(hParentWnd)
  220.         Else
  221.             hParentMenu = GethMenu(ParentMenu)
  222.         End If
  223.     End If
  224.     
  225. #If DEBUG_MODE Then
  226.     If IsMenu(hParentMenu) = 0 Then
  227.         MsgBox "DynaMenu_AddMenuObject() - Invalid hParentMenu"
  228.     End If
  229. #End If
  230.  
  231.     Menu.hMenu = hParentMenu
  232.     
  233.     If Menu.IsPopup Then
  234.         AddSubMenu Menu, hParentMenu
  235.     Else
  236.         AddMenuItem Menu, hParentMenu
  237.     End If
  238.     Menu.Caption = Menu.Caption     ' Update physical menu
  239.     Menu.Checked = Menu.Checked
  240.     Menu.Enabled = Menu.Enabled
  241.     
  242.     ' If Index=0 then set index to its true value
  243.     
  244.     If Menu.Index = 0 Then
  245.         Dim mnuTmp As CMenu
  246.         For Each mnuTmp In m_colMenus
  247.             If mnuTmp.ParentKey = Menu.ParentKey Then
  248.                 Menu.Index = Menu.Index + 1
  249.             End If
  250.         Next
  251.         Set mnuTmp = Nothing
  252.     End If
  253. End Sub
  254.  
  255. Private Sub AddMenuItem(Menu As CMenu, hParentMenu As Long)
  256.     
  257.     Dim mnu As Menu
  258.     Set mnu = Menu.MenuItem
  259.     
  260.     Menu.ItemID = GetCommand(mnu)
  261.     Dim lngRet As Long
  262.     If (Menu.Index < 1) Then
  263.         lngRet = AppendMenu(hParentMenu, MF_STRING Or MF_BYCOMMAND, _
  264.                                                 Menu.ItemID, DEF_CAPTION)
  265.     Else
  266.         lngRet = InsertMenu(hParentMenu, Menu.Index - 1, _
  267.                         MF_STRING Or MF_BYPOSITION, Menu.ItemID, DEF_CAPTION)
  268.     End If
  269.     Debug.Assert lngRet
  270.  
  271. #If DEBUG_MODE Then
  272.     If (lngRet = 0) Then
  273.         MsgBox "DynaMenu_AddMenuItem() - Failed to Insert/Append Menu Item"
  274.     End If
  275. #End If
  276. End Sub
  277.  
  278. Private Sub AddSubMenu(Menu As CMenu, hParentMenu As Long)
  279.     
  280.     Dim mnu As Menu
  281.     Set mnu = Menu.MenuItem
  282.     
  283.     Menu.hPopupMenu = CreatePopupMenu()
  284.  
  285.     Dim lngRet As Long
  286.     If (Menu.Index = 0) Then
  287.         lngRet = AppendMenu(hParentMenu, MF_POPUP, Menu.hPopupMenu, DEF_CAPTION)
  288.     Else
  289.         lngRet = InsertMenu(hParentMenu, Menu.Index - 1, _
  290.                  MF_POPUP Or MF_BYPOSITION, Menu.hPopupMenu, DEF_CAPTION)
  291.     End If
  292.     
  293. #If DEBUG_MODE Then
  294.     If (lngRet = 0) Then
  295.         MsgBox "DynaMenu_AddSubMenu() - Failed to Insert/Append Menu Item"
  296.     End If
  297. #End If
  298. End Sub
  299.  
  300. '*******************************************************************************
  301. '
  302. '-------------------------------------------------------------------------------
  303.  
  304.