2011-07-03 14 views
1

我試圖在wxWidgets中製作一個用戶控件來表示一個音頻混音器中的頻道。所以,每個頻道都有一套標準的控制器(一些滑塊,按鈕等)。wxWidgets:正確地製作一個包含其他控件的用戶控件本身

因此,在我的課堂中,我有一個sizer,在其中添加了我需要的各種子控件。到目前爲止,這工作。

但我的問題是

  • ,如果我從wxPanel,控制工程的佈局但是,沒有得到,因爲我希望它(它得到篩分器擴展,以適應子控件)孩子們得到任何事件(如EVT_LEFT_DOWN等)。我試圖連接一個事件運行event.Skip()但沒有幫助的主控制。

  • 如果我改變我的類從wxControl代替(或wxFrame,也可能是其他一些人我試​​過的)推導,子控件獲取事件,但整個事情不會在分級機得到擴展它位於,它只是被繪製成一個小盒子(大約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實例本身得到我連接任何事件對它,但它的孩子控制沒有。

+1

從wxPanel派生是正確的方法。奇怪的是,你的控件沒有得到事件。請發佈您的代碼,以便我們可以看到發生了什麼。 – ravenspoint

+0

用代碼更新。 – tacospice

回答

0

您的控件應該是從wxPanel派生的類的子項,而不是面板父項的子項。

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

應該

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

如果你想使用一個wxFrame,你也可以這樣做。但是,您必須確保一旦創建了框架,就可以將框架添加到框架,然後添加一個面板,然後添加另一個sizer。然後你可以在sizer中放入你想要的東西。由於某些原因,如果您不放置sizer,然後面板,然後sizer,wxwidgets將無法正確調整大小。

+0

哇!這聽起來像一個複雜的方式來做簡單的事情! – ravenspoint

相關問題