MFC 添加动态菜单

动态创建一个右键菜单,将可供选择的各项列出来。

每个菜单项添加一个ID,因为弹出菜单有几项是不确定的,所以不能逐一添加菜单响应函数,而是将命令都映射到

如下类型的函数中,UINT nID为添加菜单项是设置的ID。依据该ID来判断用户点击的是哪个菜单项。

  void OnShowMember(UINT nID)

001// popMenuDlg.cpp : 实现文件
002//
003  
004#include "stdafx.h"
005#include "popMenu.h"
006#include "popMenuDlg.h"
007  
008#ifdef _DEBUG
009#define new DEBUG_NEW
010#endif
011  
012<SPAN style="BACKGROUND-COLOR: #ffff00">// windows各个资源都有一个ID,这里1100-1200给弹出菜单预留
013const int   MENU_START  =   1100;
014const int   MENU_END        =   1200;
015</SPAN>CpopMenuDlg::CpopMenuDlg(CWnd* pParent /*=NULL*/)
016    : CDialog(CpopMenuDlg::IDD, pParent)
017{
018    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
019}
020  
021void CpopMenuDlg::DoDataExchange(CDataExchange* pDX)
022{
023    CDialog::DoDataExchange(pDX);
024}
025  
026BEGIN_MESSAGE_MAP(CpopMenuDlg, CDialog)
027    ON_WM_SYSCOMMAND()
028    ON_WM_PAINT()
029    //}}AFX_MSG_MAP
030    ON_BN_CLICKED(IDC_BUTTON1, &CpopMenuDlg::OnBnClickedButton1)
031<SPAN style="BACKGROUND-COLOR: #ffff00">    // 将MENU_START ~ MENU_END范围的命令映射到单个消息函数
032    ON_COMMAND_RANGE(MENU_START, MENU_END, &CpopMenuDlg::OnShowMember)
033</SPAN>END_MESSAGE_MAP()
034  
035  
036<SPAN style="BACKGROUND-COLOR: #ffff00">// CpopMenuDlg 消息处理程序
037void CpopMenuDlg::OnShowMember(UINT nID)
038{
039    int nIndex = nID - MENU_START;
040    GetDlgItem(IDC_STATIC_MEMBER)->SetWindowText(m_MemberList[nIndex]);
041}
042</SPAN>
043BOOL CpopMenuDlg::OnInitDialog()
044{
045    CDialog::OnInitDialog();
046  
047    // 成员初始化
048    m_MemberList.Add(_T("宇智波Q"));
049    m_MemberList.Add(_T("宇智波左助"));
050    m_MemberList.Add(_T("宇智波斑"));
051    m_MemberList.Add(_T("宇智波柚"));
052  
053    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
054}
055  
056void CpopMenuDlg::OnSysCommand(UINT nID, LPARAM lParam)
057{
058    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
059    {
060    }
061    else
062    {
063        CDialog::OnSysCommand(nID, lParam);
064    }
065}
066  
067// 如果向对话框添加最小化按钮,则需要下面的代码
068//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
069//  这将由框架自动完成。
070  
071void CpopMenuDlg::OnPaint()
072{
073    if (IsIconic())
074    {
075        CPaintDC dc(this); // 用于绘制的设备上下文
076  
077        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
078  
079        // 使图标在工作矩形中居中
080        int cxIcon = GetSystemMetrics(SM_CXICON);
081        int cyIcon = GetSystemMetrics(SM_CYICON);
082        CRect rect;
083        GetClientRect(&rect);
084        int x = (rect.Width() - cxIcon + 1) / 2;
085        int y = (rect.Height() - cyIcon + 1) / 2;
086  
087        // 绘制图标
088        dc.DrawIcon(x, y, m_hIcon);
089    }
090    else
091    {
092        CDialog::OnPaint();
093    }
094}
095  
096//当用户拖动最小化窗口时系统调用此函数取得光标显示。
097//
098HCURSOR CpopMenuDlg::OnQueryDragIcon()
099{
100    return static_cast<HCURSOR>(m_hIcon);
101}
102  
103void CpopMenuDlg::OnBnClickedButton1()
104{
105<SPAN style="BACKGROUND-COLOR: #ffff00">    POINT pt;
106    ::GetCursorPos(&pt);
107  
108    // 创建弹出菜单
109    CMenu  popMenu;
110    popMenu.CreatePopupMenu();
111    // 添加菜单项
112    for(int i = 0;  i < m_MemberList.GetCount(); ++i)
113    {
114        popMenu.AppendMenu(MF_STRING, MENU_START + i, m_MemberList[i]);
115    }
116    // 弹出菜单
117    popMenu.TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this);
118    popMenu.DestroyMenu();
119</SPAN>}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC对话框中添加动态菜单并为菜单添加响应事件的步骤如下: 1. 创建一个MFC对话框应用程序。 2. 在对话框资源中添加一个菜单资源,可以在资源视图中右键点击对话框资源,选择“添加菜单”。 3. 打开对话框类的头文件(如MyDialog.h),添加成员变量来存储菜单指针,例如在类的私有部分添加以下代码: ```cpp private: CMenu m_menu; ``` 4. 打开对话框类的源文件(如MyDialog.cpp),在OnInitDialog()函数中动态加载菜单和为菜单添加响应事件,以下为示例代码: ```cpp BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 动态加载菜单 if (m_menu.LoadMenu(IDR_MENU1)) { SetMenu(&m_menu); } // 为菜单添加响应事件 CMenu* pSubMenu = m_menu.GetSubMenu(0); // 假设菜单只有一个子菜单 if (pSubMenu) { pSubMenu->AppendMenu(MF_STRING, ID_MENU_ITEM1, _T("菜单项1")); pSubMenu->AppendMenu(MF_STRING, ID_MENU_ITEM2, _T("菜单项2")); } return TRUE; } ``` 5. 在对话框类的消息映射中添加菜单响应事件的处理函数,如以下示例: ```cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ON_COMMAND(ID_MENU_ITEM1, &CMyDialog::OnMenuItem1) ON_COMMAND(ID_MENU_ITEM2, &CMyDialog::OnMenuItem2) END_MESSAGE_MAP() // 菜单项1的响应函数 void CMyDialog::OnMenuItem1() { // 处理菜单项1的代码 } // 菜单项2的响应函数 void CMyDialog::OnMenuItem2() { // 处理菜单项2的代码 } ``` 通过以上步骤,就可以在MFC对话框中实现动态菜单,并为菜单添加响应事件。在OnInitDialog()函数中使用菜单指针动态加载菜单资源,并使用AppendMenu()函数添加菜单项。在消息映射中为每个菜单添加对应的响应函数,即可在点击菜单项时执行相应的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值