如何获得指向颜色按钮的指针

时间:2013-11-09 14:50:02

标签: c++ mfc color-picker

我在工具栏上有一个颜色按钮,它是在CMainFrame中创建的,如何从View中获取指向 CMFCColorMenuButton 派生类的颜色按钮的指针,如下面的代码(MSOffice2007Demo的一部分)样品)? :

CMFCRibbonBar* pRibbon = ((CMainFrame*) GetTopLevelFrame())->GetRibbonBar();
ASSERT_VALID(pRibbon);

CMFCRibbonColorButton* pFontColorBtn = DYNAMIC_DOWNCAST(CMFCRibbonColorButton, pRibbon->FindByID(ID_FONT_COLOR));

1 个答案:

答案 0 :(得分:2)

访问工具栏中的按钮控件的过程需要许多步骤才能导航到相关控件。以下列表说明了这一点:

  1. 获取指向托管工具栏的框架窗口的指针。
  2. 获取指向工具栏控件的指针。
  3. [可选] 获取特定命令ID的按钮索引。
  4. 获取指向指定索引处按钮的指针。
  5. 将基类按钮类型转换为派生类。

    // 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 );
    
  6. 关于实施的一些注释:

    为简洁起见,省略了错误处理。只要有DYNAMIC_DOWNCAST,返回值就可以是NULL,并且必须进行检查。同样,对CommandToIndex的调用可能会失败并需要处理错误。

    DYNAMIC_DOWNCAST类似于C ++ dynamic_cast,因为它评估运行时类型是否可以转换为另一种类型。虽然并非所有Windows控件关系都可以建模为C ++类层次结构,但MFC提供了自己的转换工具:DYNAMIC_DOWNCAST

    传递给CommandToIndex的调用的ID是通过资源脚本或运行时分配给CMFCColorMenuButton的命令ID,具体取决于控件的创建方式。