wxWidgets: Правильное создание пользовательского элемента управления, который содержит другие элементы управления внутри себя. - PullRequest
1 голос
/ 03 июля 2011

Я пытаюсь настроить пользовательский элемент управления в wxWidgets для представления канала в микшере звука.Итак, каждый канал имеет стандартный набор элементов управления внутри себя (некоторые ползунки, кнопки и т. Д.).

Итак, в моем классе есть классификатор, в который я добавляю различные дочерние элементы управления, которые мне нужны.Пока это работает.

Но у меня есть проблемы

  • , если я наследую от wxPanel, макет элемента управления работает так, как я ожидаю (он расширяется вsizer, чтобы соответствовать дочерним элементам управления), однако ни один из дочерних элементов не получает никаких событий (например, EVT_LEFT_DOWN и т. д.).Я попытался подключить событие для основного элемента управления, который запускает event.Skip (), но это не помогло.

  • Если я изменю свой класс на производный от wxControl вместо (или wxFrame, иливозможно, некоторые другие, которые я пробовал), дочерние элементы управления do получают события, но все это не раскрывается в том, в котором он находится, а просто рисуется в виде крошечного прямоугольника (около 10-20 квадратных пикселей), хотя дочерние элементы управления занимают гораздо больше места.

Есть идеи?

Обновление:

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 голосов
/ 07 июля 2011

Если вы хотите использовать wxFrame, вы также можете сделать это.Тем не менее, вы должны убедиться, что после создания фрейма вы добавите в фрейм sizer, затем панель, а затем еще один sizer.Затем вы можете положить все, что вы хотите в Sizer.По какой-то причине wxwidgets не будет иметь правильный размер, если вы не разместите sizer, затем панель, затем sizer.

0 голосов
/ 03 июля 2011

Ваши элементы управления должны быть дочерними элементами вашего класса, производными от wxPanel, а НЕ дочерними элементами родительского элемента панели.

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

должно быть

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