wxWigets 无法从 wxGridSizer 内部传递事件(或任何内容),如果有面板或 wxScrolledWind

wxWigets fails to pass events (or anything) from inside a wxGridSizer if there is a panel or wxScrolledWindow

本文关键字:任何内 wxScrolledWind 如果 wxGridSizer 内部 事件 wxWigets      更新时间:2023-10-16

在wxWidgets 3.0.4中,使用Visual-C++ 2010 Express编译。在主框架中,如果我直接创建一个 wxGridSizer 并添加到大小器中,它可以正常工作,但如果相反 wxBoxSizer -> wxScrolledWindow -> wxGridSizer 它不会与内部的任何内容交互,包括事件。

这一切都始于 wxBoxSizer 中的一个面板,您可以根据需要插入任意数量的面板(在您看到需要多少列/行之前)。这个想法是让wxScrolledWindow照顾,如果不适合一个屏幕。 我尝试了很多很多东西,并在网上寻找。为了简化并尽量减少显示行为,我将在一个框架内显示代码(带有我不显示的菜单和菜单栏以指向问题),该框架添加一个复选框,这是我能想到的最简单的事情。没有连接,没有复选框的任何内容。没有 wxScrolledWindow,你可以检查它,使用 wxScrolledWindow,你不能。 我尝试过使用面板而不是wxScrolledWindow,带有事件,具有更多内容。和相同的行为。 知道吗?提前谢谢你。

工程:

grid = new wxGridSizer( 3, 2, 0, 0 );  //declared in the class
wxCheckBox *prueba_cbox = new wxCheckBox( this, wxID_ANY, wxT("Check Me!"), wxDefaultPosition, wxDefaultSize, 0 );
grid->Add( prueba_cbox, 0, wxALL, 5 );
grid->Fit(this);
this->SetSizer(grid);
this->Layout();
this->Centre( wxBOTH );

不工作:

misizer = new wxBoxSizer(wxHORIZONTAL);
wxScrolledWindow* miscroll = new wxScrolledWindow(this, wxID_ANY);
miscroll->SetScrollRate( 0, 16 );
misizer->Add(miscroll, 1, wxALL | wxEXPAND, 0);
grid = new wxGridSizer( 3, 2, 0, 0 );
wxCheckBox *prueba_cbox = new wxCheckBox( this, wxID_ANY, wxT("Check Me!"), wxDefaultPosition, wxDefaultSize, 0 );
grid->Add( prueba_cbox, 0, wxALL, 5 );
grid->Fit( miscroll );
miscroll->SetSizer( grid );
misizer->Fit(this);
this->SetSizer( misizer );
misizer->Layout();
this->Layout();
this->Centre( wxBOTH );

更多, 在: "misizer->Add(miscroll, 1, wxALL |wxEXPAND, 0);">

取决于边界,有 10 个或更多作品,有 5 个或更少不起作用。在这个简单的例子中;当实际将面板放入内部时,即使边框为 120,事件也不起作用。

AFAIU 您希望具有以下布局:

wxFrame->wxBoxSizer->wxScrolledWindow->wxGridSizer->wxCheckBox

到目前为止,wxGridSizer没有错,但prueba_cbox的父级应该miscroll而不是this

wxCheckBox *prueba_cbox = new wxCheckBox( this, wxID_ANY, wxT("Check Me!"), wxDefaultPosition, wxDefaultSize, 0 );

应该是 miscroll 的孩子,而不是这个(框架)的孩子。

谢谢(很抱歉这个愚蠢的问题)