SOUI中菜单的简单实现

效果图先放上来

使用控件comboview来实现一级菜单的功能

XML部分的配置
					<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" >
						<liststyle margin-x="1" margin-y="1" colorBkgnd="#000000">
							<template itemHeight="30" colorSelected="#B8B8B8" colorHover="#cccccc">
								<!-- <button pos="|0,[5,@115,@22" offset="-0.5,0" name="btn_menu" trackMouseEvent="1" skin=""/> -->
								<text pos="|0,[5,@115,@22" offset="-0.5,0" name="btn_menu" trackMouseEvent="1" msgtransparent="0" colorText="#ffffff" />
							</template>
						</liststyle>
						<editstyle vcenter="1" colorText="#000000" align="left" colorBkgnd="#000000" enable="1" show="0" name="showText" />
					</comboview>

参数解释:
dropDown="0" 显示可编辑的状态 这种只有点击 右侧的下拉按钮 才能触发下拉的事件(如果设置为1 则在这个区域都可以触发下拉)
btnSkin="skin_btn_seting" 这个属性设置↓这个按钮的皮肤 可以设置成点击某个图标 然后有下拉菜单的显示状态
在text标签中 有一个 msgtransparent="0" 这个属性是为了可以捕获到 EVT_CMD这个点击事件
美化效果 将 editstyle标签中 加上 show="0" 不显示edit编辑框 配上一样的背景色 就可以实现点击 显示下拉框的效果了

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

适配器的类组成

#pragma once

#include "helper/SAdapterBase.h"

#include <vector>
namespace SOUI
{
	class CTestCobviewAdapter : public SAdapterBase
	{
	public:
		CTestCobviewAdapter(std::vector<SStringT> vctInfo) :m_VctInfo(vctInfo)
		{

		}
		~CTestCobviewAdapter()
		{
			if (m_VctInfo.size() > 0)
			{
				m_VctInfo.swap(std::vector<SStringT>());
			}
		}

		virtual int getCount()
		{
			return m_VctInfo.size();
		}

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

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

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

	private:
		std::vector<SStringT> m_VctInfo;
	};
}

 

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

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

LRESULT CMainDlg::OnSetingMenu(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	UINT message = uMsg;
	int *item = (int*)wParam;
	if (0 == *item)	//点击的第一个
	{
		SMessageBox(NULL, L"菜单一", L"标题", 0);
	}
	else if (1 == *item)	//点击的第二个
	{
		SMessageBox(NULL, L"菜单二", L"标题", 0);
	}
	else if (2 == *item)	//点击的第三个
	{
		SMessageBox(NULL, L"菜单三", L"标题", 0);
	}
	//SStringT *name = (SStringT*)lParam;	//需要什么数据可以通过结构体来进行传输
	//SMessageBox(NULL, SStringT().Format(_T("button of %d item was clicked\nbutton of name: %s"), *item, *name), _T("haha"), MB_OK);
	return LRESULT();
}

最后在OnInit中来使用

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

SComboView *pComboView = FindChildByName2<SComboView>(L"comboview_menu");
    if (pComboView)
    {
        std::vector<SStringT> vctInfo{ L"菜单1",L"菜单1", L"菜单1"};
        ILvAdapter *pAdapter = new CSetingMenuAdapter(vctInfo);
        pComboView->GetListView()->SetAdapter(pAdapter);
        pAdapter->Release();
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值