我在工具栏上有一个颜色按钮,它是在CMainFrame中创建的,如何从View中获取指向 CMFCColorMenuButton 派生类的颜色按钮的指针,如下面的代码(MSOffice2007Demo的一部分)样品)? :
CMFCRibbonBar* pRibbon = ((CMainFrame*) GetTopLevelFrame())->GetRibbonBar();
ASSERT_VALID(pRibbon);
CMFCRibbonColorButton* pFontColorBtn = DYNAMIC_DOWNCAST(CMFCRibbonColorButton, pRibbon->FindByID(ID_FONT_COLOR));
答案 0 :(得分:2)
访问工具栏中的按钮控件的过程需要许多步骤才能导航到相关控件。以下列表说明了这一点:
将基类按钮类型转换为派生类。
// 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
的调用的ID是通过资源脚本或运行时分配给CMFCColorMenuButton
的命令ID,具体取决于控件的创建方式。