wxWidgets:正确地创建一个包含其他控件的用户控件

时间:2011-07-03 12:35:02

标签: c++ wxwidgets

我正在尝试在wxWidgets中设置用户控件以表示音频混音器中的频道。因此,每个通道本身都有一组标准控件(一些滑块,按钮等)。

所以在我的课程中我有一个sizer,我在其中添加了我需要的各种子控件。到目前为止有效。

但我遇到的问题是

  • 如果我从wxPanel派生,控件的布局就像我期望的那样工作(它在sizer中扩展以适应子控件),但是没有一个孩子得到任何事件(比如EVT_LEFT_DOWN等)。我尝试连接一个运行event.Skip()的主控件的事件,但这没有帮助。

  • 如果我将我的类更改为从wxControl派生(或者wxFrame,或者可能是我尝试的其他一些人),则子控件获取事件,但整件事情并非如此在它所在的sizer中扩展,它只是被绘制成一个小盒子(大约10-20平方px),即使子控件占用更多的空间。

有什么想法吗?

更新

mangoMixerStrip.cpp

mangoMixerStrip::mangoMixerStrip(wxFrame* parent, HostChannel* channel) : wxPanel(parent)
{
    myChannel = channel;
    SetBackgroundColour(wxColour(172,81,90));

    wxBoxSizer* s = new wxBoxSizer(wxVERTICAL);

    // some custom controls i made which all work fine when added like any other control, derived from wxPanel also
    faderPan = new mangoFader(parent, 200, false, 55);
    faderGain = new mangoFader(parent, 200, true, 126);    
    buttonSolo = new mangoButton(parent, false, ButtonGraphic::Solo);

    s->Add(faderPan);
    s->Add(buttonSolo);
    s->Add(faderGain);

    this->SetSizer(s);

    this->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(mangoMixerStrip::mouseDown)); // this function simply contains event.Skip()
}

在我的主要wxFrame中

mangoFrameMain::mangoFrameMain(wxWindow* parent) : FrameMain( parent )
{   
    HostChannel* h =  new HostChannel();
    h->setName("what up"); // these 2 lines unrelated to the UI

    mangoMixerStrip *test = new mangoMixerStrip(this, h);
    this->GetSizer()->Add(test, 1, wxFIXED_MINSIZE, 0);
}

并澄清:mangoMixerStrip实例本身会获取我连接到它的任何事件,但它的子控件不会。

2 个答案:

答案 0 :(得分:0)

您的控件应该是从wxPanel派生的类的子级,而不是面板父级的子级。

   faderPan = new mangoFader(parent, 200, false, 55);

应该是

  faderPan = new mangoFader(this, 200, false, 55);

答案 1 :(得分:0)

如果您想使用wxFrame,也可以这样做。但是,您必须确保在创建框架后,将大小调整器添加到框架,然后添加面板,然后添加另一个大小调整器。然后你可以在sizer中放置你想要的任何东西。出于某种原因,如果你不放置sizer,然后是panel,然后是sizer,那么wxwidgets的大小不会正确。