SOUI官方论坛

 找回密码
 立即注册
查看: 107|回复: 2

SOUI中菜单的简单实现

[复制链接]
  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    358

    主题

    793

    帖子

    6906

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    6906
    发表于 2020-1-6 08:28:52 | 显示全部楼层 |阅读模式
    20190313190047592.gif
    使用控件comboview来实现一级菜单的功能
    1. XML部分的配置
    2.                                         <comboview pos="-180,5,@120,@20" dropDown="0" dropHeight="150" animateTime="0" margin-x="2" margin-y="2" curSel="0" name="comboview_menu" btnSkin="skin_btn_seting" >
    3.                                                 <liststyle margin-x="1" margin-y="1" colorBkgnd="#000000">
    4.                                                         <template itemHeight="30" colorSelected="#B8B8B8" colorHover="#cccccc">
    5.                                                                 <!-- <button pos="|0,[5,@115,@22" offset="-0.5,0" name="btn_menu" trackMouseEvent="1" skin=""/> -->
    6.                                                                 <text pos="|0,[5,@115,@22" offset="-0.5,0" name="btn_menu" trackMouseEvent="1" msgtransparent="0" colorText="#ffffff" />
    7.                                                         </template>
    8.                                                 </liststyle>
    9.                                                 <editstyle vcenter="1" colorText="#000000" align="left" colorBkgnd="#000000" enable="1" show="0" name="showText" />
    10.                                         </comboview>
    复制代码
    参数解释:
    dropDown="0" 显示可编辑的状态 这种只有点击 右侧的下拉按钮 才能触发下拉的事件(如果设置为1 则在这个区域都可以触发下拉)
    btnSkin="skin_btn_seting" 这个属性设置↓这个按钮的皮肤 可以设置成点击某个图标 然后有下拉菜单的显示状态
    在text标签中 有一个 msgtransparent="0" 这个属性是为了可以捕获到 EVT_CMD这个点击事件
    美化效果 将 editstyle标签中 加上 show="0" 不显示edit编辑框 配上一样的背景色 就可以实现点击 显示下拉框的效果了

    相关的代码部分(代码比较简单 就直接写上来了)

    适配器的类组成
    1. #pragma once

    2. #include "helper/SAdapterBase.h"

    3. #include <vector>
    4. namespace SOUI
    5. {
    6.         class CTestCobviewAdapter : public SAdapterBase
    7.         {
    8.         public:
    9.                 CTestCobviewAdapter(std::vector<SStringT> vctInfo) :m_VctInfo(vctInfo)
    10.                 {

    11.                 }
    12.                 ~CTestCobviewAdapter()
    13.                 {
    14.                         if (m_VctInfo.size() > 0)
    15.                         {
    16.                                 m_VctInfo.swap(std::vector<SStringT>());
    17.                         }
    18.                 }

    19.                 virtual int getCount()
    20.                 {
    21.                         return m_VctInfo.size();
    22.                 }

    23.                 virtual void getView(int position, SWindow *pItem, pugi::xml_node xmlTemplate)        //表示第几个 从0开始
    24.                 {
    25.                         if (pItem->GetChildrenCount() == 0)
    26.                         {
    27.                                 pItem->InitFromXml(xmlTemplate);
    28.                         }

    29.                         SButton *pBtn = pItem->FindChildByName2<SButton>(L"btn_test");
    30.                         pBtn->SetWindowText(SStringT().Format(_T("%s"), m_VctInfo[position]));
    31.                         pBtn->GetRoot()->SetUserData(position);
    32.                         pBtn->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CTestCobviewAdapter::OnButtonClick, this));
    33.                 }

    34.                 bool OnButtonClick(EventArgs *pEvt)
    35.                 {
    36.                         SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
    37.                         int iItem = pBtn->GetRoot()->GetUserData();
    38.                         SStringT btnName = pBtn->GetWindowText();
    39.                         SMessageBox(NULL, SStringT().Format(_T("button of %d item was clicked\nbutton of name: %s"), iItem, btnName), _T("haha"), MB_OK);
    40.                        
    41.                         return true;
    42.                 }

    43.         private:
    44.                 std::vector<SStringT> m_VctInfo;
    45.         };
    46. }
    复制代码

    这里通过在点击事件之后 将对应的事件处理 通过 sendmessage分发出去 就可以实现来分别处理各个事件

    MESSAGE_HANDLER_EX(WM_SETING_MENU,OnSetingMenu)  //使用这个来接收消息的处理分发的事件

    1. LRESULT CMainDlg::OnSetingMenu(UINT uMsg, WPARAM wParam, LPARAM lParam)
    2. {
    3.         UINT message = uMsg;
    4.         int *item = (int*)wParam;
    5.         if (0 == *item)        //点击的第一个
    6.         {
    7.                 SMessageBox(NULL, L"菜单一", L"标题", 0);
    8.         }
    9.         else if (1 == *item)        //点击的第二个
    10.         {
    11.                 SMessageBox(NULL, L"菜单二", L"标题", 0);
    12.         }
    13.         else if (2 == *item)        //点击的第三个
    14.         {
    15.                 SMessageBox(NULL, L"菜单三", L"标题", 0);
    16.         }
    17.         //SStringT *name = (SStringT*)lParam;        //需要什么数据可以通过结构体来进行传输
    18.         //SMessageBox(NULL, SStringT().Format(_T("button of %d item was clicked\nbutton of name: %s"), *item, *name), _T("haha"), MB_OK);
    19.         return LRESULT();
    20. }
    复制代码

    最后在OnInit中来使用

    在初始化的时候来使用    (包含在Init里面即可)

    1. SComboView *pComboView = FindChildByName2<SComboView>(L"comboview_menu");

    2.     if (pComboView)

    3.     {

    4.         std::vector<SStringT> vctInfo{ L"菜单1",L"菜单1", L"菜单1"};

    5.         ILvAdapter *pAdapter = new CSetingMenuAdapter(vctInfo);

    6.         pComboView->GetListView()->SetAdapter(pAdapter);

    7.         pAdapter->Release();

    8.     }
    复制代码




    ————————————————
    版权声明:本文为CSDN博主「JamesWu9527」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Wuzm_/article/details/88539084

    该用户从未签到

    20

    主题

    237

    帖子

    1017

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1017

    突出贡献优秀版主

    发表于 2020-1-7 10:38:35 | 显示全部楼层
    SOUI有菜单啊,为什么要这么麻烦?
    SMenu, SMenuEx都有。
  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    358

    主题

    793

    帖子

    6906

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    6906
     楼主| 发表于 2020-1-7 13:33:39 | 显示全部楼层
    setoutsoft 发表于 2020-1-7 10:38
    SOUI有菜单啊,为什么要这么麻烦?
    SMenu, SMenuEx都有。

    转载别人的,可能他用的还是低版本
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛 ( 粤ICP备18103663号-2 )

    GMT+8, 2020-1-18 09:38

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表