zoukankan      html  css  js  c++  java
  • VC++ 创建一个动态增长的层叠菜单

        工作中需要创建一个动态增长的层叠菜单,类似于动态增长的多语言切换菜单,也是废了好大劲哪,分享一下,请交流参考。

        类似效果图:

        

        弹出子菜单各菜单项的意义一致,用ON_COMMAND_RANGE宏来统一实现消息映射。

        首先是弹出子菜单的创建:  

        CMenu subMenu;             
        subMenu.CreatePopupMenu(); 
        for (int i = 0; i < m_aLanguages.GetSize(); i++)
        {
             subMenu.AppendMenu(MF_STRING, ID_LANGUAGE_FIRST + i, GetLanguageName(m_aLanguages[i]) );
        }
        CString menustr(_T("Language"));
        popMenu.AppendMenu(MF_POPUP, (UINT)subMenu.m_hMenu, menustr); 
        

          DWORD pos = GetMessagePos();
          CPoint pt(LOWORD(pos), HIWORD(pos));
          popMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, pt.x, pt.y, AfxGetMainWnd());

        m_aLanguages是已知的语言ID Array, GetLanguageName函数可以获取对应语言ID的语言名称,ID_LANGUAGE_FIRST是语言菜单项起始ID。
        
        其次是菜单消息映射实现:
        afx_msg void OnLanguage(UINT nId);
    
        ON_COMMAND_RANGE(ID_LANGUAGE_FIRST, ID_LANGUAGE_LAST, OnLanguage)
    
        void CMainFrame::OnLanguage(UINT nId)
        {
              UINT nCurSelID = nID - ID_LANGUAGE_FIRST;
              // Do something ......        
        }

        注意:ON_COMMAND_RANGE消息映射函数的参数是nId,而不是wParam、lParam。

  • 相关阅读:
    [树形dp] Jzoj P5814 树
    [快速幂][数学][dp] Jzoj P5813 计算
    [差分] Jzoj P5812 区间
    [贪心][模拟] Jzoj P5811 简单的填数
    如何用c++发出音乐
    网络流初步详解
    【纪中模拟2019.08.01】【JZOJ2644】数列
    【纪中模拟2019.08.02】【JZOJ1308】取数游戏
    2019.08纪中 XC谈OI学习方法论
    C++STL容器
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6688658.html
Copyright © 2011-2022 走看看