DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

新建一个单文档程序

在查看菜单项中增加两个子菜单,分别为隐藏工具栏(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("右键菜单"));
 
posted on   DoubleLi  阅读(8745)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2013-05-16 SQLite数据库中的SQL语句及使用
2013-05-16 SQLite3源码在Windows及WinCE平台下的编译方法
2013-05-16 标准C++中的string类的用法总结
点击右上角即可分享
微信分享提示