Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取指向颜色按钮的指针_C++_Mfc_Color Picker - Fatal编程技术网

C++ 如何获取指向颜色按钮的指针

C++ 如何获取指向颜色按钮的指针,c++,mfc,color-picker,C++,Mfc,Color Picker,我在工具栏上有一个颜色按钮,它是在CMInframe中创建的,如何从视图中获取指向CMFCColorMenuButton派生类的颜色按钮的指针,如下面的代码(MSOffice2007Demo示例的一部分)?: 访问工具栏中的按钮控件的过程需要许多步骤才能导航到相关控件。以下列表说明了这一点: 获取指向承载工具栏的框架窗口的指针 获取指向工具栏控件的指针 [可选]获取特定命令ID的按钮索引 获取指向指定索引处按钮的指针 将基类按钮类型转换为派生类 // Get pointer to mainfra

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


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

  • 获取指向承载工具栏的框架窗口的指针
  • 获取指向工具栏控件的指针
  • [可选]获取特定命令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 );
    
  • 关于实施的几点说明:

    为了简洁起见,省略了错误处理。每当出现
    动态\u向下广播时
    返回值可以是
    NULL
    ,必须进行检查。同样,调用
    CommandToIndex
    可能会失败,并需要错误处理

    <> >代码>动态>下拉>代码>类似于C++ <代码> DyrimCysCase<代码>,它评估运行时类型是否可以转换为另一种类型。虽然并非所有的Windows控件关系都可以被建模为C++类层次结构,但是MFC提供了自己的转换工具:<代码> DycICIO-LASCAST
    传递给调用
    CommandToIndex
    的ID是通过资源脚本或在运行时分配给
    CMFCColorMenuButton
    的命令ID,具体取决于控件的创建方式。

    您提出了两个问题。标题中的问题在您发布的代码中得到了回答。第二个问题,如何使用指针,是相当不具体的。这是一个指针。您可以像C/C++中的任何其他指针一样使用它。在MSOffice2007Demo示例中,其应用程序具有功能区栏,因此您可以通过GetRibbonBar()获取CMFCRibbonColorButton,但我的测试应用程序将其作为工具栏按钮,它派生自CMFCColorMenuButton类,因此我无法使用FindByID()获取指向CMFCColorMenuButton的指针,我的问题是,如何通过使用DYNAMIC_DOWNCAST函数或任何想法,plz获得指向工具栏上CMFCColorMenuButton的指针@很抱歉,让你误会了。从通读开始。步骤相同:获取指向您的
    CMainFrame
    的指针,调用以获取工具栏并使用以检索按钮的ID。您已准备好执行最终查找。最重要的是:先学习Windows API,否则您的MFC冒险将不会成功/*错误C2440:“正在初始化”:无法从“CControlBar”转换为“CMFCToolBar*”*/…但如果我将代码更改为“CControlBar*pToolbar=…相同的代码…”,则下一行将发生错误*/CMFCColorMenuButton*pFontColorBtn=DYNAMIC\u DOWNCAST(CMFCColorMenuButton,pToolbar->GetItemID(ID\u CHAR\u COLOR))/*错误C2039:'GeTimeID:不是'CmCuBar’*的成员/你同时尝试学习Windows API、MFC和C++。你应该考虑退后一步,至少要和他们中的一个一起加快速度,C++最好。这是在这里完成的,只要我能做程序,我会记住这个课程。
    // 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 );