无法迭代右侧 children 来更改颜色

Having trouble iterating over the right children to change their color

我想制作一个菜单,其中有多个 wxStaticTexts,当其中一个被点击时它变成黑色,其余的 are/revert 变回灰色(如果它们之前被点击过,否则他们只会保持灰色)

问题是我篡改了这段代码,它非常适合做第一部分,它将被点击的项目变成黑色,但它不会将其余部分变回灰色。我对解决方案的尝试是在 else 块中。我没有尝试任何其他方法,因为我仍在研究 C++ 和 WxWidgets,而且我仍然没有完全理解此代码段中使用的一些概念。

void MyFrame::OnMenuTxtBtnLeftClickPanel(wxMouseEvent& event) {

wxObject* obj = event.GetEventObject();
wxPanel* objPanel = ((wxPanel*)obj);
wxWindowList objChild = objPanel->GetChildren();

    for (wxWindowList::iterator it = objChild.begin(); it != objChild.end(); it++) {

        wxStaticText* aStaticText = dynamic_cast<wxStaticText*>(*it);

        if (aStaticText) {
            aStaticText->SetForegroundColour(wxColour("#000000"));
        }
        else {
            // Doesn't do anything when compiled
            // it should change the StaticTexts that weren't clicked back to grey
            dynamic_cast<wxStaticText*>(*it)->SetForegroundColour(wxColour("#C8C6C6"));
        }

    }

这对我有用:

void MyFrame::OnMenuTxtBtnLeftClickPanel(wxMouseEvent& event)
{
    wxWindow* cur = wxDynamicCast(event.GetEventObject(),wxWindow);
    wxColor fg = m_panel1->GetForegroundColour();

    wxWindowList& children = m_panel1->GetChildren();

    for ( auto it = children.begin() ; it != children.end() ; ++it )
    {
        wxWindow* win = *it;
        if ( wxDynamicCast(win, wxStaticText) )
        {
            if ( win == cur )
            {
                win->SetForegroundColour(wxColour("#000000"));
            }
            else
            {
                win->SetForegroundColour(fg);
            }
        }
    }
}

在此代码中,m_panel1 是一个 wxPanel,它是所有静态文本的父级。

在 GTK 上,它看起来像这样:

处理程序绑定到框架构造函数中的每个静态文本控件,如下所示:

    m_staticText1->Bind(wxEVT_LEFT_UP,&MyFrame::OnMenuTxtBtnLeftClickPanel,this);
    m_staticText2->Bind(wxEVT_LEFT_UP,&MyFrame::OnMenuTxtBtnLeftClickPanel,this);
    m_staticText3->Bind(wxEVT_LEFT_UP,&MyFrame::OnMenuTxtBtnLeftClickPanel,this);
    m_staticText4->Bind(wxEVT_LEFT_UP,&MyFrame::OnMenuTxtBtnLeftClickPanel,this);

m_staticText1 等应更改为您用于文本控件的名称。