BCG的RibbonBar实现动态加载变化面板方法

重点:

 

1.将要加载的面板存储成单独的category,然后不显示这个category(加载的时候删除或者怎么处理都行)。

2.读取原来的xml信息,将信息存储到CBCGPRibbonInfo中,然后就可以对这个信息进行操作
 

//存储建模的大小类的xml信息
void CLbRibbonUIDialog::SaveCreateModelXmlInfo(const CString& xmlFile)
{
	CBCGPRibbonInfoLoader loader(m_ribbonInfo, CBCGPRibbonInfo::e_UseRibbon);
	if (!loader.Load(xmlFile))
	{
		TRACE0("Cannot load ribbon from buffer\n");
		return;
	}
}

3.获取panel信息,将panel加载在当前的category里面。

//获取所需要的相关panel信息
bool CLbRibbonUIDialog::GetBigAndSmallAboutPanelInfo(const CString& bName, const CString& sName, CBCGPBaseRibbonInfo::XArrayPanel& info)
{
	//获取ribbonbar信息
	CBCGPRibbonInfo::XRibbonBar& ribbonInfo = m_ribbonInfo.GetRibbonBar();
	//获取Category信息
	CBCGPBaseRibbonInfo::XArrayCategory& categories = ribbonInfo.m_arCategories;
	for (int i = 0; i < categories.GetSize(); ++i)
	{
		const CBCGPRibbonInfo::XCategory& infoCategory =
			*(const CBCGPRibbonInfo::XCategory*)categories[i];

		//获取名称
		if (infoCategory.m_strName != bName)
		{
			continue;
		}

		const CBCGPBaseRibbonInfo::XArrayPanel& m_arPanels = infoCategory.m_arPanels;
		for (int j = 0; j < m_arPanels.GetSize(); ++j)
		{
			CBCGPRibbonInfo::XPanel* infoPanel = m_arPanels[j];
			
			tstring accName = infoPanel->m_strAccTestingName;
			if (accName.empty())
			{
				continue;
			}
			//根据逗号分隔符解析
			std::vector<tstring> vecName;
			StringHelper::split(accName, _T(","), vecName);

			tstring smallName(sName);
			auto iter = std::find_if(vecName.begin(), vecName.end(), [&smallName](const tstring& name)
				{
					return smallName == name;
				});

			if (iter == vecName.end())
			{
				continue;
			}
			//如果找到,则把这个panel加入集合
			info.Add(infoPanel);
		}
		return true;
	}
	return false;
}
//根据大小类的名称进行建模模块的大小类切换
void CLbRibbonUIDialog::ModelPanelChangeByBigAndSmallClass(const CString& bName, const CString& sName)
{
	//删除建模多余面板
	DeleteExcessModelPanels();
	//获取大侠类信息
	CBCGPBaseRibbonInfo::XArrayPanel panelInfo;
	GetBigAndSmallAboutPanelInfo(bName, sName, panelInfo);

	if (panelInfo.IsEmpty())
	{
		return;
	}
	int num = m_wndRibbonBar->GetCategoryCount();
	//获取建模个数数据
	for (int i = 0; i < num; ++i)
	{
		CBCGPRibbonCategory* category = m_wndRibbonBar->GetCategory(i);
		if (!category)
		{
			continue;
		}
		LPCTSTR name = category->GetName();
		CString cstr(name);
		//如果不是建模
		if (cstr != modelName)
		{
			continue;
		}

		CLbRibbonConstructor info;
		//循环处理panel数据
		for (int i = 0; i < panelInfo.GetSize(); ++i)
		{
			const CBCGPRibbonInfo::XPanel& infoPanel = *(const CBCGPRibbonInfo::XPanel*)panelInfo[i];
			//添加面板
			CBCGPRibbonPanel* pPanel = AddPanelIntoCategory(category, infoPanel);
			if (pPanel != NULL)
			{
				ASSERT_VALID(pPanel);
				info.CreateConstructPanel(*pPanel, infoPanel);
			}
		}
		break;
	}
}

4.如果要加载其他的数据,需先删除原先位置的信息

//删除除建模基础外多余的面板
bool CLbRibbonUIDialog::DeleteExcessModelPanels()
{
	int num = CLbCommonUtils::Getinstance().GetModelPanelNum();
	if (num < 0)
	{
		return false;
	}
	//获取标签数量
	int categoryNum = m_wndRibbonBar->GetCategoryCount();
	for (int i = 0; i < categoryNum; ++i)
	{
		CBCGPRibbonCategory* category = m_wndRibbonBar->GetCategory(i);
		
		CString cstr = category ? category->GetName() : CString();
		//如果不是建模
		if (cstr != modelName)
		{
			continue;
		}
		//删除建模多余数据
		for (int j = category->GetPanelCount(); j >= num; --j)
		{
			category->RemovePanel(j);
		}
		break;
	}
	return true;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值