У меня есть цветная кнопка на панели инструментов, она была создана в CMainFrame, как я могу получить указатель на цветную кнопку, которая CMFCColorMenuButton производный класс от View, как и в приведенном ниже коде (часть примера MSOffice2007Demo)? :
CMFCRibbonBar* pRibbon = ((CMainFrame*) GetTopLevelFrame())->GetRibbonBar();
ASSERT_VALID(pRibbon);
CMFCRibbonColorButton* pFontColorBtn = DYNAMIC_DOWNCAST(CMFCRibbonColorButton, pRibbon->FindByID(ID_FONT_COLOR));
Процесс доступа к элементам управления на панели инструментов требует нескольких шагов для перехода к соответствующему элементу управления. Следующий список иллюстрирует это:
Преобразовать тип кнопки базового класса в производный класс.
// Get pointer to mainframe window
CMainFrame* pFrameWnd = DYNAMIC_DOWNCAST( CMainFrame, AfxGetMainWnd() );
// Get pointer to the toolbar
CBasePane* pPane = pFrameWnd->GetPane( AFX_IDW_TOOLBAR );
CMFCToolBar* pToolBar = DYNAMIC_DOWNCAST( CMFCToolBar, pPane );
// Find button index for command ID
int index = pToolBar->CommandToIndex( ID_COLOR_PICKER );
// Retrieve button
CMFCToolBarButton* pButton = pToolBar->GetButton( index );
// Convert button to appropriate type
CMFCColorMenuButton* pColorButton = DYNAMIC_DOWNCAST( CMFCColorMenuButton,
pButton );
Несколько замечаний по реализации:
Обработка ошибок была опущена для краткости. Всякий раз, когда есть DYNAMIC_DOWNCAST
возвращаемое значение может быть NULL
и должен быть проверен. Аналогично, призыв к CommandToIndex
может потерпеть неудачу и требует обработки ошибок.
DYNAMIC_DOWNCAST
похож на C ++ dynamic_cast
тем, что он оценивает, может ли тип времени выполнения быть преобразован в другой тип. Хотя не все отношения управления Windows могут быть смоделированы как иерархия классов C ++, MFC предоставляет собственный инструмент преобразования: DYNAMIC_DOWNCAST
,
Идентификатор передан на звонок CommandToIndex
идентификатор команды, назначенный CMFCColorMenuButton
либо через скрипт ресурса, либо во время выполнения, в зависимости от того, как создается элемент управления.
Других решений пока нет …