VB.net 动态添加菜单响应单击事件

来源:互联网 发布:mac无系统联网重装 编辑:程序博客网 时间:2024/05/17 21:26

以前 VB 6.0 我要调一堆 API 感觉好过瘾 呵呵 现在找不到这种感觉了 哈!记得vb 6 的 时候生气用Win32写了个Clock  掉了上百个 API 连VB 6 的窗体都没用, 那个叫过瘾 一切都在控制中的感觉真好。看来我还是适合用 MASM Win32 的。哈哈 废话 到此结束。动态添加菜单在 .net 中很容易的。

首先建立一个XML 文件用来存储 菜单信息 (本例使用 DataHelper.xml)
 
<?xml version="1.0" encoding="utf-8" ?>
<DataHelper>
  <Menu>
    <IsSeparator>0</IsSeparator>
    <IsTopMenu>0</IsTopMenu>
    <TopMenuItemIndex>2</TopMenuItemIndex>
    <SubMenuItemIndex></SubMenuItemIndex>
    <MenuID>1</MenuID>
    <ParentID>0</ParentID> 
    <Text>基本数据库(&amp;B)...</Text>
    <Image></Image>
    <ToolTipText></ToolTipText>
    <Visible>True</Visible>
    <Name>DataConvert</Name>
    <ShortcutKeys></ShortcutKeys>
  </Menu>
  <Menu>
    <IsSeparator>1</IsSeparator>
    <IsTopMenu>0</IsTopMenu>
    <TopMenuItemIndex>2</TopMenuItemIndex>
    <SubMenuItemIndex></SubMenuItemIndex>
    <MenuID>2</MenuID>
    <ParentID>0</ParentID>
  </Menu>

  <Menu>
    <IsSeparator>0</IsSeparator>
    <IsTopMenu>0</IsTopMenu>
    <TopMenuItemIndex>2</TopMenuItemIndex>
    <SubMenuItemIndex></SubMenuItemIndex>
    <MenuID>2</MenuID>
    <ParentID>0</ParentID>
    <Text>计生系统(&amp;J)...</Text>
    <Image></Image>
    <ToolTipText></ToolTipText>
    <Visible></Visible>
    <Name>DataConvert</Name>
    <ShortcutKeys>131140</ShortcutKeys>
  </Menu>

  <Menu>
    <IsSeparator>1</IsSeparator>
    <IsTopMenu>0</IsTopMenu>
    <TopMenuItemIndex>2</TopMenuItemIndex>
    <SubMenuItemIndex></SubMenuItemIndex>
    <MenuID>2</MenuID>
    <ParentID>0</ParentID>
  </Menu>

  <Menu>
    <IsSeparator>0</IsSeparator>
    <IsTopMenu>0</IsTopMenu>
    <TopMenuItemIndex>2</TopMenuItemIndex>
    <SubMenuItemIndex></SubMenuItemIndex>
    <MenuID>3</MenuID>
    <ParentID>0</ParentID>
    <Text>党员系统(&amp;D)...</Text>
    <Image></Image>
    <ToolTipText></ToolTipText>
    <Visible></Visible>
    <Name>DataConvert</Name>
    <ShortcutKeys></ShortcutKeys>
  </Menu>

  <Menu>
    <IsSeparator>1</IsSeparator>
    <IsTopMenu>0</IsTopMenu>
    <TopMenuItemIndex>2</TopMenuItemIndex>
    <SubMenuItemIndex></SubMenuItemIndex>
    <MenuID>2</MenuID>
    <ParentID>0</ParentID>
  </Menu>

  <Menu>
    <IsSeparator>0</IsSeparator>
    <IsTopMenu>0</IsTopMenu>
    <TopMenuItemIndex>2</TopMenuItemIndex>
    <SubMenuItemIndex></SubMenuItemIndex>
    <MenuID>4</MenuID>
    <ParentID>0</ParentID>
    <Text>民政系统(&amp;M)...</Text>
    <Image></Image>
    <ToolTipText></ToolTipText>
    <Visible></Visible>
    <Name>DataConvert</Name>
    <ShortcutKeys></ShortcutKeys>
  </Menu>
</DataHelper>

好了第一步开始,读取XML文件 我们使用 DataSet 来干这活,不过我是在 DataHerlper.Common 工程来干这事的。哇 分层阿!
这个是个结构 我用的 看取那个Table

 

Imports System.Drawing
Imports System.Windows.Forms

Namespace DataHelper.Common

    
Public Enum DataHelperConfigTableName
        DropDownMenu 
= 0
        Plugins 
= 1
    
End Enum


End Namespace


Imports System.Data
Imports DataHelper.Common.Caching
Imports System.Windows.Forms

Namespace DataHelper.Common
    
Public Class SharedClass

        
Public Shared Function GetDataHelperConfig(Optional ByVal TableName As DataHelperConfigTableName = DataHelperConfigTableName.DropDownMenu) As DataTable
            
Dim strDataHelperConfigFile As String
            
Dim ds As New DataSet
            
Dim dt As New DataTable

            strDataHelperConfigFile 
= Application.StartupPath & "ConfigDataHelper.xml" 'Application.StartupPath

            ds 
= DataCache.GetCache("DataHelperConfig")
            
If ds Is Nothing Then
                
Dim xmlReader As XmlTextReader = New XmlTextReader(strDataHelperConfigFile)
                ds 
= New DataSet
                ds.ReadXml(xmlReader)
                dt 
= ds.Tables(TableName)
                DataCache.Insert(
"DataHelperConfig", ds, DataCache.CreateFileCacheDependency(strDataHelperConfigFile))
            
Else
                dt 
= ds.Tables(TableName)
            
End If
            
Return dt
        
End Function


    
End Class

End Namespace


我们得到菜单信息了接下来就要动态添加菜单了 这又是一个工程(DataHelper.UserInterface) 分层吗
'**********************************************************************************************************
'
 Programmer By Shadow (QQ:33512603)
'
 User Interface MainMenu  Class
'
 The MainMenu class create menu for localappliction 
'
 Corpright(C) 2006 Jiang Jian
'
**********************************************************************************************************
'
 程序设计:江建
'
**********************************************************************************************************

Imports System.IO
Imports System.Windows.Forms
Imports DataHelper.Common
Imports DataHelper.PluginsInterface

Namespace DataHelper.UserInterface
    
Public Class MainMenu
        
Private MenuClick As New MainMenuClick

Public Methods

Private Methods

    
End Class

End Namespace



'**********************************************************************************************************
'
 Programmer By Shadow (QQ:33512603)
'
 User Interface MainMenuClick  Class
'
 The MainMenuClick class response menu click event
'
 Corpright(C) 2006 Jiang Jian
'
**********************************************************************************************************
'
 程序设计:江建
'
**********************************************************************************************************

Imports System.Diagnostics
Imports System.Windows.Forms


Namespace DataHelper.UserInterface

    
Public Class MainMenuClick
        
Private Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As IntegerByVal hWndNewParent As IntegerAs Integer
        
Private Declare Function SetWindowPos Lib "user32" (ByRef hwnd As IntegerByRef hWndInsertAfter As IntegerByVal x As IntegerByVal y As IntegerByVal cx As Integer

ByVal cy As IntegerByVal wFlags As IntegerAs Integer

        
Private Const SWP_NOSIZE = &H1
        
Private Const SWP_NOMOVE = &H2

        
Private DataConvert As New Process

Public Methods

Overrides Methods


    
End Class

End Namespace


最后是测试 哈哈 终于完了 在你的主窗体下 加入一个 MenuScript 控件 名称为 MainMenu 这次测试未添加 顶级菜单 如果要添加顶级菜单 请修改XML文件 IsTopMenu 为1

  Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        
Dim test As New MainMenu
        test.CreateMenu(
Me.MainMenu)
  
End Sub

 

 

原创粉丝点击