duilib菜单动态添加

这篇博客介绍了如何在Duilib中创建自定义菜单窗口,包括XML布局和动态添加菜单项的方法。作者遇到了网上教程的局限性,如需要重新编译库和静态的菜单结构。最终,他们通过自定义接口解决动态添加菜单项的问题,并提供了代码示例,展示了如何初始化和设置菜单大小。然而,代码缺乏通用性。
摘要由CSDN通过智能技术生成

网上有很多,都特么不好使。
有的直接在xml中使用了Menu
也就是

<menu>
...
</menu>

这样子要重新编译duilib,不然那不识别这种形式。
再就是 动态添加的问题。
网上的demo大部分是通过xml来显示菜单的,菜单的层级结构也是定死的。不好用。
最后我用的是官网的那个暂时解决了问题。
在这里插入图片描述
说暂时,是因为,代码不具有通用性。
这是菜单的xml

<?xml version="1.0" encoding="utf-8"?>
<Window name="menu_window" bktrans="true"  size="100,82">
 <Font id="0" name="宋体" size="13" bold="false"/>
 <Font id="1" name="宋体" size="12"/>
 <Font id ="3" name="微软雅黑" size="13" bold="false" italic="false" />
<VerticalLayout bkimage="file='menu_bk.png' corner='40,8,8,8'" hole="false">
	<List name="menu_list"  header="hidden" inset="8,8,8,8" itemhotimage="file='menu_item_select_hot.png' corner='2,2,2,2'" itemdisabledbkcolor="#FF0000FF">
		<ListContainerElement name="menu_Open" height="22">
			<Label text="打开" align="center" name="open_label" mouse="false"/>
		</ListContainerElement>
	</List>
</VerticalLayout>
</Window>

动态添加item的方式。

			CMenuWnd* pMenu = new CMenuWnd();
			if (pMenu == NULL) { return; }
			//传入item的值
			pMenu->setMenuType("showNumberMenu");
			pMenu->setContentList(ZHRWConfigSettings::GetInstance()->getAllShowNumberList());
			//POINT pt = { msg.ptMouse.x, msg.ptMouse.y };
			//::ClientToScreen(*this, &pt);
			CDuiRect rcWindow;
			GetWindowRect(m_hWnd, &rcWindow);
			rcWindow.top = rcWindow.top + msg.pSender->GetPos().bottom;
			rcWindow.left = rcWindow.left + msg.pSender->GetPos().left;
			POINT pt = { rcWindow.left ,rcWindow.top };

			pMenu->Init(msg.pSender, pt);

其中setContentList()接口是我自定义的。


    LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        m_pm.Init(m_hWnd);
        CDialogBuilder builder;
        CControlUI* pRoot = builder.Create(_T("menu_show_number.xml"), (UINT)0, NULL, &m_pm);
        ASSERT(pRoot && "Failed to parse XML");
        m_pm.AttachDialog(pRoot);

		
        //尝试自定义添加
        CListUI* pUiList = static_cast<CListUI*>(m_pm.FindControl(_T("menu_list")));
        pUiList->RemoveAll();

        for (auto it = m_contentList.begin();it != m_contentList.end(); it++)
        {
            string t_strContent = *it;
			CListContainerElementUI* pContanerUi = new CListContainerElementUI();
			CLabelUI* pLabelUi = new CLabelUI();
			pLabelUi->SetText(t_strContent.c_str());
            pLabelUi->SetFont(3);
			pLabelUi->SetFixedHeight(24);
            pLabelUi->SetTextPadding(CDuiRect(4, 0, 0, 0));

			pContanerUi->Add(pLabelUi);
			pContanerUi->SetFixedHeight(24);
			pContanerUi->SetName(m_menuType.c_str());
			pContanerUi->SetUserData(t_strContent.c_str());

			pUiList->Add(pContanerUi);
        }

        int iHeight = 0;
        if (m_contentList.size() > 0)
        {
            iHeight = m_contentList.size() * 24 + 16; //
        }
        
        ResizeClient(110, iHeight);

        int iCount = pUiList->GetCount();
		CDuiRect rcWnd;
		GetWindowRect(m_hWnd, &rcWnd);
       
        //尝试修改
        CLabelUI* pLabelItem = static_cast<CLabelUI*>(m_pm.FindControl(_T("open_label")));
        pLabelItem->SetText("World");

        
        m_pm.AddNotifier(this);
        m_pm.SetRoundCorner(3, 3);

        AdjustPostion();
        return 0;
    }

这里面循环添加菜单的item。然后手动设置了菜单总的大小。

就这样。

duilib菜单实例是使用duilib库创建具有菜单功能的界面示例。duilib是一款基于C++的开源UI库,可用于开发Windows桌面应用程序。下面是一个简单的duilib菜单实例的说明。 首先,我们需要在主窗口中添加一个菜单栏。可以通过在XML布局文件中添加<Menu>元素来实现。该元素包含多个<MenuElement>元素,每个元素对应一个菜单项。 每个菜单项都可以包含一个<label>元素和一个<hover>元素。label元素定义了菜单项的文本,hover元素定义了鼠标悬停在菜单项上时的效果。 参考以下示例: ```cpp <?xml version="1.0" encoding="UTF-8"?> <Window width="800" height="600" caption="duilib菜单示例"> <Menu> <MenuElement> <label>文件</label> <hover>红色</hover> </MenuElement> <MenuElement> <label>编辑</label> <hover>绿色</hover> </MenuElement> <MenuElement> <label>帮助</label> <hover>蓝色</hover> </MenuElement> </Menu> </Window> ``` 在代码中,我们可以加载并显示上述XML布局文件,即可创建一个带有菜单栏的窗口。当用户单击菜单项时,可以根据点击的菜单项执行相应的操作。 例如,可以给每个<MenuElement>元素添加一个id属性,并在代码中注册菜单项的点击事件。通过判断点击的菜单项id,可以执行不同的操作。 参考以下示例: ```cpp void OnMenuClick(const std::wstring& id) { if(id == L"menu_file") { // 处理文件菜单项点击事件 } else if(id == L"menu_edit") { // 处理编辑菜单项点击事件 } else if(id == L"menu_help") { // 处理帮助菜单项点击事件 } } // 注册菜单项的点击事件 CControlUI* pMenuElementFile = pWindow->FindControl(L"menu_file"); pMenuElementFile->AttachClick(OnMenuClick); CControlUI* pMenuElementEdit = pWindow->FindControl(L"menu_edit"); pMenuElementEdit->AttachClick(OnMenuClick); CControlUI* pMenuElementHelp = pWindow->FindControl(L"menu_help"); pMenuElementHelp->AttachClick(OnMenuClick); ``` 通过以上代码,每个菜单项的点击事件被注册后,当用户单击菜单项时,相关的操作函数会被调用。 这就是一个简单的duilib菜单实例,该实例演示了如何创建一个带有菜单栏的界面,并在用户单击菜单项时执行相应操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值