效果图先放上来
使用控件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();
}