如何在VB运行中动态添加菜单项目?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在VB运行中动态添加菜单项目?相关的知识,希望对你有一定的参考价值。

方法1:使用菜单数组
在文件菜单里增加一个菜单项,标题任意,现在假设菜单项的Name属性是mnuDynamic
更改菜单项mnuDynamic的可见属性,使mnuDynamic.Visible= False
更改菜单项mnuDynamic的下标(索引)属性,使mnuDynamic.Index=0
在程序中控制菜单项mnuDynamic的动态装入。
Load mnuDynamic(1)
mnuDynamic(1).Caption = "动态菜单1"
mnuDynamic(1).Visible = True

方法2:使用用API函数
新建一个模块,复制以下代码。
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const MF_STRING = &H0&
Public Const MF_BYCOMMAND = &H0&
Public Const GWL_WNDPROC = (-4)
Public Const WM_COMMAND = &H111
Public OldWinProc As Long

Public Function OnMenu(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'响应菜单事件
If wMsg = WM_COMMAND Then
If wParam = 1000 Then MsgBox "Dynamic"
End If
OnMenu = CallWindowProc(OldWinProc, hwnd, wMsg, wParam, lParam)
End Function

窗体代码:
Private Sub Form_Load()
Dim hMenu As Long, hSubMenu As Long
hMenu = GetMenu(Me.hwnd)
hSubMenu = GetSubMenu(hMenu, 0)
InsertMenu hSubMenu, 0, MF_BYCOMMAND Or MF_STRING, 1000, "Dynamic"
OldWinProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf OnMenu)
End Sub
参考技术A 是不是这样?
System.Diagnostics.Process.Start("notepad")
这样呢?
大哥,你是想调用别人程序,还是自己的程序啊?
调用别人程序是要路径的啊?把路径写进去也行啊?

如何在mfc中动态添加子菜单

【中文标题】如何在mfc中动态添加子菜单【英文标题】:How to add submenu dynamically in mfc 【发布时间】:2015-02-24 11:41:49 【问题描述】:

我已经使用资源编辑器在我的 Windows 程序中添加了一个菜单,现在我想在某些特定条件下添加一个子菜单。 下面是我的一段代码。

这是我的 Menu.h 文件

包括

类 CmainWn:公共 CFrameWnd

公共 :CmainWn();

DECLARE_MESSAGE_MAP()

afx_msg void OnAB();

;

类 CApp:公共 CWinApp

公共 : BOOL InitInstance();

;

这是我的 Menu.cpp

包括“菜单.h”

包括“resource.h”

CmainWn ::CmainWn()

Create(NULL,"Menu Testing",WS_OVERLAPPEDWINDOW,rectDefault,NULL,(LPCTSTR)IDR_MENU1);

BOOL CApp :: InitInstance()

m_pMainWnd=new CmainWn();

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return true;

void CmainWn::OnAB()

AfxMessageBox("Hello");

BEGIN_MESSAGE_MAP(CmainWn,CFrameWnd)

ON_COMMAND(ID_A_B, &CmainWn::OnAB)

END_MESSAGE_MAP()

CApp 应用程序;

如您所见,我创建了一个名为 A 的主菜单和一个名为 B 的子菜单。 我想在B下动态添加一个菜单,怎么做?

【问题讨论】:

您的问题是this question 格式错误的版本(4 小时前提出)。 你查了吗***.com/questions/3673546/dynamic-menu-using-mfc @GingerJack 是的,我已经完成了,并且能够在运行时创建动态菜单,但无法在我的主菜单中附加为子菜单项。 我建议您阅读OnInitMenuPopup 文档。 @sergiol:它已经死了,除非你有enough reputation to see deleted content。通过点击链接,我仍然可以很好地看到这个问题。 【参考方案1】:

必须添加到 Windows 资源文件 (projectname.rc) 的示例代码

IDR_MENU1 MENU 
BEGIN
      POPUP "Main menu"
       BEGIN
           MENUITEM "Menu Item 1", ID_WINDOWS_TEST
           POPUP "Sub Menu"
        BEGIN
            MENUITEM "Sub Menu item 1",ID_WIN_TEXT
        END
    END
END 

在资源视图中查看会显示类似这样的内容

【讨论】:

这不会动态添加菜单项。

以上是关于如何在VB运行中动态添加菜单项目?的主要内容,如果未能解决你的问题,请参考以下文章

VB.net如何动态获取菜单栏中的菜单名并用树型表示

动态添加CONTEXTMENUstrip的子菜单后,无法响应CLICK

c#中如何动态添加菜单项并实现其点击?

如何在VB中建一个二级菜单 并在二级菜单中添加子菜单项

C#如何动态添加菜单项是Systray应用程序

如何在FastReport报表中动态添加数据集