C++ wxRibbonButtonBar:更改按钮';在运行时恢复图像

C++ wxRibbonButtonBar:更改按钮';在运行时恢复图像,c++,wxwidgets,C++,Wxwidgets,我在寻找一种更好的方法,在运行时更改wxRibbonButtonBar上按钮的图像。在MS Excel中,当一个或多个单元格的背景发生变化时,功能区按钮会反映上次选定的颜色。因此,我的目标是实现类似的目标。我想到了两种可能的方法: 第一种方法:有两种功能: 1) AddButton(int button_id,…,常量wxBitmap和位图,…) 2) DeleteButton(int按钮\u id) 因为按钮的ID是已知的,所以我想在需要更改位图时调用DeleteButton,然后调用AddB

我在寻找一种更好的方法,在运行时更改
wxRibbonButtonBar
上按钮的图像。在MS Excel中,当一个或多个单元格的背景发生变化时,功能区按钮会反映上次选定的颜色。因此,我的目标是实现类似的目标。我想到了两种可能的方法:

第一种方法:有两种功能:

1) AddButton(int button_id,…,常量wxBitmap和位图,…)

2) DeleteButton(int按钮\u id)

因为按钮的ID是已知的,所以我想在需要更改位图时调用
DeleteButton
,然后调用
AddButton
。虽然这会奏效,但我怀疑这是一个好方法

另一种可能的方法:由于
AddButton
函数返回指向
wxRibbonButtonBarButtonBase
的指针,因此有以下函数

void SetItemClientData(wxRibbonButtonBarButtonBase*项,void*数据)

返回值,
wxRibbonButtonBarButtonBase
,可以作为参数传递给它,指向特定的按钮。但是,在这里,我不确定参数
data
到底指的是什么(因为按钮可以有标题、位图等),以及如何将wxBitmap作为
数据
传递给此函数

下面的代码是第一种和第二种方法的混合,更多的是第一种方法;然而,我怀疑这是最佳的方式

wxColourDialog dlg(this);

wxColour color;
if (dlg.ShowModal() == wxID_OK) color = dlg.GetColourData().GetColour(); else return;

wxMemoryDC dc;
wxBitmap bmp(bucket_xpm); //32 by 32
dc.SelectObject(bmp);
dc.SetBrush(color);
dc.DrawRectangle(0, 28, 32, 32);

int itemID=m_ribbonButtonBarFormat->GetItemId(m_BtnFillColor);
m_ribbonButtonBarFormat->DeleteButton(itemID);
m_BtnFillColor=m_ribbonButtonBarFormat->AddButton(itemID, wxT("Fill Color"), bmp, wxEmptyString);
m_ribbonButtonBarFormat->Realize();
任何想法都将不胜感激,如果这有利于第二种方法,一段代码片段将非常有帮助。

我的目标是“我在寻找一种更好的方法,在运行时更改wxRibbonButtonBar上按钮的图像。在MS Excel中,当一个或多个单元格的背景发生变化时,功能区按钮会反映上次选定的颜色。”

我的方法的缺点是我的目标是更改
wxRibbonButtonBar
的位图。事实上,Excel通过混合按钮工具实现了这一点,当单击下拉工具时,它会显示调色板,然后单击按钮后,它会应用选定的颜色(但我仍然不知道如何显示浮动调色板)

因此,我将我的方法从
wxRibbonButtonBar
更改为
wxRibbonToolBar
,并添加了一个具有以下代码的混合按钮:

m_ribbonToolBarFormat->AddHybridTool(ID_FORMATFILLCOLOR, bmp, wxT("Fill Color"));
混合工具可以生成两个事件:1)OnRibbonToolClicked2)OnRibbonToolDropdownClicked

OnRibbonToolDropdownFillColorClicked(wxRibbonToolBarEvent& event)
{
    wxColourDialog dlg(this);

    if (dlg.ShowModal() == wxID_OK) m_LastChosenFillColor = dlg.GetColourData().GetColour(); else return;

    wxMemoryDC dc;
    wxBitmap bmp(bucket_xpm);
    dc.SelectObject(bmp);
    dc.SetBrush(m_LastChosenFillColor);
    dc.DrawRectangle(0, 28, 32, 32);

    m_ribbonToolBarFormat->SetToolNormalBitmap(ID_FORMATFILLCOLOR, bmp);
    m_ribbonToolBarFormat->Refresh();
使用
SetToolNormalBitmap
,我可以在不删除工具的情况下在运行时设置工具的图像