重点:
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;
}