BOOL CXTPRibbonBuilder::BuildCategories(CXTPPropExchange* pPX, CXTPRibbonBar* pRibbonBar) { CXTPPropExchangeEnumeratorPtr pEnumerator(pPX->GetEnumerator(_T("CATEGORY"))); POSITION pos = pEnumerator->GetPosition(0); while (pos) { CXTPPropExchangeSection pxTab(pEnumerator->GetNext(pos)); CString strElementName; PX_String(&pxTab, _T("ELEMENT_NAME"), strElementName); CCmdTarget* pElement = CreateElement(strElementName); if (pElement == NULL) continue; CXTPRibbonTab* pTab = DYNAMIC_DOWNCAST(CXTPRibbonTab, pElement); if (!pTab) { delete pElement; continue; } CString strName; PX_String(&pxTab, _T("NAME"), strName); pTab->SetCaption(strName); CString strKeys; PX_String(&pxTab, _T("KEYS"), strKeys); pTab->SetKeyboardTip(strKeys); pRibbonBar->InsertTab(pRibbonBar->GetTabCount(), pTab); m_arrImageLarge.RemoveAll(); m_arrImageSmall.RemoveAll(); CXTPPropExchangeSection pxPanels(pxTab->GetSection(_T("PANELS"))); BuildGroups(&pxPanels, pTab); LoadIcons(&pxTab); } return TRUE; }