C++ 基于切换事件更改wxToolBarToolBase的图标

C++ 基于切换事件更改wxToolBarToolBase的图标,c++,wxwidgets,C++,Wxwidgets,我在wxToolBar中有一个切换按钮 我希望该按钮根据其状态显示两个不同的图标(一个是“按下”时的图标,另一个是“释放”时的图标) 我试过这个: // toolbar setup: muteBtn = toolBar -> AddCheckTool( ID_MUTE_BTN, wxT( "Mute" ), wxBitmap( wxT( "unmute.png" ), wxBITMAP_TYPE_PNG ), wxBitmap( wxT(

我在
wxToolBar
中有一个切换按钮

我希望该按钮根据其状态显示两个不同的图标(一个是“按下”时的图标,另一个是“释放”时的图标)

我试过这个:

// toolbar setup:

muteBtn = toolBar -> AddCheckTool(
      ID_MUTE_BTN,
      wxT( "Mute" ),
      wxBitmap( wxT( "unmute.png" ), wxBITMAP_TYPE_PNG ),
      wxBitmap( wxT( "unmute.png" ), wxBITMAP_TYPE_PNG ),
      wxT( "Enable/Disable sounds" ),
      wxT( "Enable/Disable sounds" )
);

...

// EVT_BUTTON handler:
void MyFrame::MuteChanged( wxCommandEvent& event )
{
    if ( event.IsChecked() )
    {
        Mute();
        muteBtn -> SetNormalBitmap( wxBitmap( wxT( "mute.png" ), wxBITMAP_TYPE_PNG ) );
    }
    else
    {
        Unmute();
        muteBtn -> SetNormalBitmap( wxBitmap( wxT( "unmute.png" ), wxBITMAP_TYPE_PNG ) );
    }
    // also tried refresh and update without success:
    // toolBar -> Refresh();
    // toolBar -> Update();
}
但这种行为并不是我所期望的。而不是:

  • 启动图标:unmute.png
  • 第一次单击后:mute.png(
    mute()
    called)
  • 第二次单击后:unmute.png(
    unmute()
    called)
  • 第三次单击后:mute.png(
    mute()
    called)
我得到:

  • 启动图标:unmute.png
  • 第一次单击后:unmute.png(
    Mute()
    called)
  • 第二次单击后:mute.png(
    Unmute()
    called)
  • 第三次单击后:unmute.png(
    Mute()
    called)
在事件处理程序中,我似乎更改了图标,但位图仅在下一次单击事件时绘制

我还尝试添加
wxToolBar::Refresh()
wxToolBar::Update()
[参见代码片段],但没有成功


如何获得正确的行为?

wx的开发人员确认不应使用
wxToolBarToolBase::SetNormalBitmap()

我使用方法
wxToolBar::SetToolNormalBitmap
解决了这个问题:

// EVT_BUTTON handler:
void MyFrame::MuteChanged( wxCommandEvent& event )
{
    if ( event.IsChecked() )
    {
        Mute();
        toolBar -> SetToolNormalBitmap( ID_MUTE_BTN, wxBitmap( wxT( "mute.png" ), wxBITMAP_TYPE_PNG ) );
    }
    else
    {
        Unmute();
        toolBar -> SetToolNormalBitmap( ID_MUTE_BTN, wxBitmap( wxT( "unmute.png" ), wxBITMAP_TYPE_PNG ) );
    }
}

我为工具栏示例制作了一个补丁,并提交了这个票证:@VZ。我想这可能是wxsidgets中的一个bug。你/某人能给我建议一种获得相同结果的替代方法吗?我的(现在删除的)评论是错误的,这是正确的方法。