MFC 单文档中动态添加菜单项和响应菜单事件

简介: 新建一个单文档程序 在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏 #define ID_NEWMENU        WM_USER+101   操作工具栏和状态栏 使用Ge...

新建一个单文档程序

在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU)

在Resource.h中增加一个ID_NEWMENU宏

#define ID_NEWMENU        WM_USER+101

 

操作工具栏和状态栏

使用GetDescendantWindow函数获取工具栏和状态栏的指针

为ID_HIDE添加消息映射,编辑代码如下

    static bool m_Hide=false;
    m_Hide=!m_Hide;
    //获取工具栏指针
    CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);
    //获取状态栏指针
    CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);
    CMenu* pMenu=GetMenu();
    CMenu* pSubMenu=pMenu->GetSubMenu(2);
    if(m_Hide)
    {
        pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"显示工具栏");
        if(pWndStatusBar!=NULL)    pWndStatusBar->SetWindowText("隐藏工具栏");
        if(pWndToolBar!=NULL)    pWndToolBar->ShowWindow(SW_HIDE);
    }
    else
    {
        pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隐藏工具栏");
        if(pWndStatusBar!=NULL)    pWndStatusBar->SetWindowText("显示工具栏");
        if(pWndToolBar!=NULL)    pWndToolBar->ShowWindow(SW_SHOW);
    }

 

动态添加子菜单

为ID_NEWMENU增加消息映射,编辑代码如下

    static UINT m_NewMenu=ID_NEWMENU+1;
    //获取菜单
    CMenu* pMenu=GetMenu();
    //获取索引为2的菜单项,即第3列菜单
    CMenu* pSubMenu=pMenu->GetSubMenu(2);
    char buffer[1];
    itoa(m_NewMenu-ID_NEWMENU,buffer,10);
    if(m_NewMenu<=ID_NEWMENU+5)
    {
        pSubMenu->AppendMenu(MF_SEPARATOR); //分隔线
        pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,
                                    CString("新的菜单 ")+buffer);    
    }
    //如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的
    //消息映射表是否有这个弹出菜单中每个菜单项的处理函数,如果没有就会把那一项改为灰的   
    m_bAutoMenuEnable=false;

 

添加OnCommand的消息映射用来响应添加的子菜单项,代码如下

UINT uMsg=LOWORD(wParam);
    for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++)
        if(uMsg==i)
        {
            char buffer[1];
            itoa(i-ID_NEWMENU,buffer,10);
            MessageBox(CString("新的菜单 ") + buffer);
        }

 

右键菜单

在View类中添加OnRButtonDown的消息映射,代码如下

    CMenu pPopMenu;
    pPopMenu.CreatePopupMenu();
    if(pPopMenu==NULL);
    pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"右键菜单");
    this->ClientToScreen(&point);
    pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);

 

在View类中添加OnCommand的消息映射用来响应右键菜单的事件

UINT uMsg=LOWORD(wParam);
    if(uMsg==ID_NEWMENU+6)
        MessageBox(CString("右键菜单"));
 
目录
相关文章
|
7月前
|
关系型数据库 MySQL C#
C# winform 一个窗体需要调用自定义用户控件的控件名称
给用户控件ucQRCode增加属性: //二维码图片 private PictureBox _pictureBoxFSHLQrCode; public PictureBox PictureBoxFSHLQrCode {   get { return _pictureBoxFSHLQrCode; }   set { this.pictureBoxFSHLQrCode = value; } } 在Form1窗体直接调用即可: ucQRCode uQRCode=new ucQRCode(); ucQRCode.PictureBoxFSHLQrCode.属性= 要复制或传给用户控件上的控件的值
37 0
|
3月前
MFC的视图窗口
MFC的视图窗口
11 0
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程:winForm中MenuStrip中的添加子菜单事件-11
C#编程:winForm中MenuStrip中的添加子菜单事件-11
198 0
C#编程:winForm中MenuStrip中的添加子菜单事件
C#编程:winForm中MenuStrip中的添加子菜单事件
404 0
|
C# 前端开发
WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体
原文:http://blog.csdn.net/kiss0622/article/details/5852153 方法一: 1.父窗口代码 Window1.xaml.cs private void Button_Click(object sender, RoutedEventArgs e...
2700 0