访问工具栏中的按钮控件的过程需要许多步骤才能导航到相关控件。以下列表说明了这一点:
- 获取指向承载工具栏的框架窗口的指针。
- 获取指向工具栏控件的指针。
- [可选]获取特定命令 ID 的按钮索引。
- 获取指向指定索引处的按钮的指针。
将基类按钮类型转换为派生类。
// 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
,具体取决于控件的创建方式。