0

我在工具栏上有一个颜色按钮,它是在 CMainFrame 中创建的,我怎样才能获得指向颜色按钮的指针,它是来自 View 的CMFCColorMenuButton派生类,如下面的代码(MSOffice2007Demo 示例的一部分)?:

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

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

1 回答 1

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 );
    

关于实现的几点说明:

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

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

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

于 2013-11-10T16:05:39.303 回答