• MFC之菜单


    1菜单与菜单项的操作

    //获取菜单指针----CWnd::GetMenu()
    //GetSubMenu()获取子菜单
    /CheckMenuItem()加入/取消标记
    GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MFS_CHECKED);
    //创建缺省菜单SetDefaultItem()一个子菜单仅仅能有一个
    //GetMenu()->GetSubMenu(0)->SetDefaultItem(1,1);
    GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN);
    //图形菜单的创建SetMenuItemBitmaps()
    m_Bitmap.LoadBitmapW(IDB_BITMAP1);
    GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_Bitmap,&m_Bitmap);
    //使某项不能使用EnableMenuItem()
    //NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of 
    GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION|MF_DISABLED|MF_GRAYED);
    //将整个菜单取消SetMenu()能够载入自己的菜单,若将Cmenu为局部变量则在setmenu后调用detach()
    //SetMenu(NULL);

    2MFC菜单项的更新

    (1)为菜单某一项加入ON_UPDATE_COMMAND_UI消息并加入处理程式(在CMainframe类中)

    (2)在处理程式中决定某一菜单项是否可用是否标记等(若涉及到工具栏中的菜单项则为保持与菜单项中的同步最好採用ID标记而不是位置)

    (3)实例:void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI)

    {
    // TODO: 在此加入命令更新用户界面处理程序代码
    pCmdUI->Enable();
    }

    3右击弹出菜单的使用

    在VC++6.0中,在project -》addtoproject-》……之后进行选择就能够为工程加入一个单击右键弹出菜单功能。可是在VS中没有Pop-Up Menu组件,右键菜单须要手动加入。

    加入方法例如以下:
    1、在资源视图中加入所需的右键菜单
    2、选择对应的类,单文档时选中View类在属性中加入WM_CONTEXTMENU消息
    3、在OnContextMenu加入例如以下代码

    void CMenuView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/Point)
    {
    // TODO: 在此处加入消息处理程序代码
    if(Point.x==-1&&Point.y==-1)
    {
    CRect rect;
    GetClientRect(rect);
    ClientToScreen(rect);
    Point=rect.TopLeft();
    Point.Offset(5,5);
    }
    CMenu menu;
    menu.LoadMenuW(IDR_MENU1);
    CMenu* pPopup=menu.GetSubMenu(0);
    ASSERT(pPopup!=NULL);
    CWnd* PwndPopupOwner=this;
    while (PwndPopupOwner->GetStyle()&WS_CHILD)
    {
    PwndPopupOwner=PwndPopupOwner->GetParent();
    }
    pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,Point.x,Point.y,PwndPopupOwner);

    }

    4动态加入菜单

    在CMainframe::OnCreate()函数中

    (1)CMenu::AppendMenu()将一个菜单项加入到现有菜单项末尾

    (2)创建popup菜单CMmenu::CreatePopMenu();

    (3)插入PopUpMenu菜单CMenu::InsertMenu()

    (4)删除菜单CMenu::DeleteMenu()

    (5)代码演示样例:


    (6)对加入的菜单进行命令响应

    手动加入消息响应函数和消息映射

    (7)其它操作

    void CMenuView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // TODO: 在此加入消息处理程序代码和/或调用默认值
    static int indexm=313;
    CClientDC dc(this);//获取客户区画布
    if(0x0d==nChar)
    {
    if(0==index++)
    {
    m_Menu.CreatePopupMenu();
    GetParent()->GetMenu()->AppendMenuW(MF_POPUP,(UINT)m_Menu.m_hMenu,_T("phonenote"));
    //重绘菜单条CWnd::DrawMenuBar()
    GetParent()->DrawMenuBar();//重绘菜单
    }
    m_Menu.AppendMenuW(MF_STRING,indexm++,m_PStr.Left(m_PStr.Find(' ')));
    m_PStr.Empty();
    Invalidate();//重绘画布
    }


    else
    {
    m_PStr+=(char)nChar;
    dc.TextOutW(0,0,m_PStr);


    }


    CView::OnChar(nChar, nRepCnt, nFlags);
    }




  • 相关阅读:
    【MySQL】MySQL的Sequence
    【Spring】Junit加载Spring容器作单元测试
    【Java】JDBC连接MySQL
    【Java】斐波那契数列(Fibonacci Sequence、兔子数列)的3种计算方法(递归实现、递归值缓存实现、循环实现、尾递归实现)
    【Java】Map杂谈,hashcode()、equals()、HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap
    【Java】常见的Set类型,HashSet、TreeSet、LinkedHashSet
    【数据结构和算法】选择排序
    【数据结构与算法】插入排序
    【数据结构与算法】冒泡排序
    【Web】写个HTML页面去调试HTTP接口方便些
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5391888.html
Copyright © 2020-2023  润新知