CMenu 菜单操作

来源:互联网 发布:java xss防御 编辑:程序博客网 时间:2024/05/24 16:16

一. 方法1: 直接添加菜单资源到对话框资源


首先你先在资源视图中添加并创建一个菜单的资源,然后打开对话框,在MENU中选择你创建的菜单的ID,运行程序,当你打开该对话框时就可以发现你的菜单出现在对话框中。





二. 方法2: 代码直接添加菜单资源


在CTestDialog类声名中添加成员变量CMenu m_menu
再在CTestDialog::OnInitDialog() 中添加如下代码:
// 加载菜单资源m_menu.LoadMenu(IDR_MENU1);// 设置当前菜单SetMenu(&m_menu);// 当你不需要菜单时可以用 SetMenu(NULL); // 来取消当前菜单


三. 方法3: 代码生成菜单, 代码直接添加菜单


例如要产生如下的菜单


 

1. 菜单说明

这里有A, B, C, D共4个菜单; 其中B是A.2的子菜单, C是B.2的子菜单, D是A.6的子菜单.


2. 定义资源

在Resource.h中添加一些ID值, 不要与其他ID值相同.

#define ID_ITEM_A1 400#define ID_ITEM_A 2 401#define ID_ITEM_A 3 402#define ID_ITEM_A 4 403#define ID_ITEM_A 5 404#define ID_ITEM_B1 405#define ID_ITEM_B 2 406#define ID_ITEM_B 3 407#define ID_ITEM_C1 408#define ID_ITEM_C 2 409#define ID_ITEM_C 3 410#define ID_ITEM_D1 411#define ID_ITEM_D 2 412#define ID_ITEM_D 3 413


3. 添加菜单变量


在CTestDialog类声名中添加成员变量
CMenu m_menuA;CMenu m_menuB;CMenu m_menuC;CMenu m_menuD;

4. 添加菜单创建代码


在CTestDialog::OnInitDialog() 中添加如下代码:
// Dm_menuD.CreateMenu();m_menuD.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_D1, "D.1"); // 第一项菜单项m_menuD.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_D2, "D.2"); // 第二项菜单项m_menuD.AppendMenu(MF_SEPARATOR | MF_POPUP, 0, "");// 分割线m_menuD.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_D3, "D.3"); // 第三项菜单项// Cm_menuC.CreateMenu();m_menuC.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_C1, "C.1"); // 第一项菜单项m_menuC.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_C2, "C.2"); // 第二项菜单项m_ menuC.AppendMenu(MF_SEPARATOR | MF_POPUP, 0, "");// 分割线m_menuC.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_C3, "C.3"); // 第三项菜单项// Bm_menuB.CreateMenu();m_menuB.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_B1, "B.1");// 第一项菜单项m_menuB.AppendMenu(MF_STRING | MF_POPUP, (UINT)m_menuC.m_hMenu, "B.2"); // 子菜单绑定到父菜单m_menuB.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_B3, "B.3");// 第三项菜单项// Am_menuA.CreateMenu();m_menuA.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_A1, "A.1");// 第一项菜单项m_menuA.AppendMenu(MF_STRING | MF_POPUP, (UINT)m_menuB.m_hMenu, "A.2"); // 子菜单绑定到父菜单m_menuA.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_A3, "A.3");// 第三项菜单项m_menuA.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_A4, "A.4");// 第四项菜单项m_menuA.AppendMenu(MF_STRING | MF_POPUP, (UINT)m_menuD.m_hMenu, "A.5");// 子菜单绑定到父菜单SetMenu(&m_menuA);




5. 菜单响应


A. 响应函数

afx_msg void OnMenuA1();afx_msg void OnMenuB3();void CTestDialog::OnMenuA1(){MessageBox(_T("A1"));}void CTestDialog::OnMenuB3(){MessageBox(_T("B3"));}


B. 消息映射

BEGIN_MESSAGE_MAP(CTestDialog, CDialog)//{{AFX_MSG_MAP(CTestDialog)…ON_COMMAND(ID_ITEM_A1, OnMenuA1)ON_COMMAND(ID_ITEM_B3, OnMenuB3)//}}AFX_MSG_MAPEND_MESSAGE_MAP()




6. 菜单的修改

 

现在修菜单要改为这样


使用下面代码
CMenu* pCMenu = GetMenu();pCMenu->ModifyMenu(4, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT)m_menuD.m_hMenu, "A.5_C");pCMenu->ModifyMenu(5, MF_BYPOSITION | MF_STRING | MF_POPUP, ID_ITEM_A6, "A.6_C");// 为了更新菜单SetMenu(0);SetMenu(&m_menuA);

7. 菜单的删除

 
菜单项的动态增加/删除
CMenu* pCMenu = GetMenu();pCMenu->DeleteMenu(3, MF_BYPOSITION);// 为了更新菜单SetMenu(0);SetMenu(&m_menuA);



四. 右键菜单




五. 小结

1. 菜单的结构也是一种树的结构, 在菜单的动态创建中, 先创建叶子, 再创建树枝, 然后把叶子绑定到树枝上.
// B
m_menuB.CreateMenu();
m_menuB.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_B1, "B.1");// 第一项菜单项
m_menuB.AppendMenu(MF_STRING | MF_POPUP, (UINT)m_menuC.m_hMenu, "B.2"); // 子菜单绑定到父菜单
m_menuB.AppendMenu(MF_STRING | MF_POPUP, ID_ITEM_B3, "B.3");// 第三项菜单项


在这里 m_menuB.GetSubMenu(0)和m_menuB.GetSubMenu(2)都会返回0; m_menuB.GetSubMenu(1)才会返回有SubMenu.
(SubItem与SubMenu是不同的)
(或者说AppendMenu只是创建菜单项, 而子菜单需要独立创建并附加)


2. 可以动态创建菜单, 那就可以很灵活了, 你可以根据程序的各种状态(例如不同权限的用户), 来动态的创建菜单.
例如你可以使用XML来配置菜单, 程序启动的时候来动态加载菜单.














0 0
原创粉丝点击