wxWidgets技术问题:如何在事件函数中引用框架内的元素?
解决点击黄色面板修改蓝色面板背景色的问题
方法一:将面板设为类成员变量(推荐)
这是最直接、易维护的实现方式,把两个面板声明为GuiFrame类的私有成员,事件处理函数即可直接访问它们。
- 修改
gui.h,在私有成员中添加两个面板指针:
#ifndef GUI_H_INCLUDED #define GUI_H_INCLUDED #include <wx/wx.h> class GuiFrame : public wxFrame { private: wxPanel* pnl_one; // 黄色面板 wxPanel* pnl_two; // 蓝色面板 public: GuiFrame(); void OnToolBtn(wxMouseEvent& event); void ShowFrame(); }; #endif
- 修改
gui.cpp的构造函数,将局部面板变量替换为类成员(同时修正原代码中冗余的wxFrame* frame,因为GuiFrame本身就是wxFrame派生类,直接用this作为父窗口即可):
#include <wx/wx.h> #include "gui.h" GuiFrame::GuiFrame() : wxFrame(nullptr, wxID_ANY, "Mapping Manager", wxPoint(100,100),wxSize(600,600)) { pnl_one = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(200,30)); pnl_one->SetBackgroundColour(wxColor(245,208,51)); // 黄色 pnl_one->Bind(wxEVT_LEFT_UP, &GuiFrame::OnToolBtn, this); pnl_two = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(200,30)); pnl_two->SetBackgroundColour(wxColor(3,173,252)); // 蓝色 wxBoxSizer *mainSizer= new wxBoxSizer(wxVERTICAL); mainSizer->Add(pnl_one, 0, wxEXPAND); mainSizer->Add(pnl_two, 1, wxEXPAND); SetSizerAndFit(mainSizer); } void GuiFrame::OnToolBtn(wxMouseEvent& event) { // 修改蓝色面板背景色,示例改为红色 pnl_two->SetBackgroundColour(wxColor(255,0,0)); pnl_two->Refresh(); // 刷新面板使颜色生效 event.Skip(); // 传递事件,保证后续可能的事件处理逻辑正常执行 } void GuiFrame::ShowFrame() { Show(true); }
方法二:使用GetChildren遍历子控件(不推荐)
如果坚持使用GetChildren,可以遍历父窗口的子控件,通过类型判断找到目标面板,但这种方式不够直观,控件结构变化时容易出错:
修改OnToolBtn函数如下:
void GuiFrame::OnToolBtn(wxMouseEvent& event) { wxWindowList children = this->GetChildren(); for (wxWindow* child : children) { // 判断是否是wxPanel,且不是触发事件的黄色面板 wxPanel* panel = dynamic_cast<wxPanel*>(child); if (panel && panel != event.GetEventObject()) { panel->SetBackgroundColour(wxColor(255,0,0)); panel->Refresh(); break; } } event.Skip(); }
内容的提问来源于stack exchange,提问作者Luca Vieceli
相关产品推荐
相关产品推荐

