2011-07-03 11 views
1

wxWidgetsでユーザーコントロールを作成して、オーディオミキサーでチャンネルを表現しようとしています。したがって、各チャンネルには、内部に標準的なコントロールセットがあります(いくつかのスライダ、ボタンなど)。wxWidgets:自分自身の内部に他のコントロールを含むユーザーコントロールを正しく作成する

私のクラスの中には、私が必要とする様々な子コントロールを追加するサイザーがあります。これまでのところ動作します。

しかし、私は(それが子コントロールに合うようにサイザーに展開されます)、それを期待して、私はしかし、のいずれも、wxPanel、制御の作品のレイアウトから派生した場合、私が持っている問題は、

  • をしています子供たちはEVT_LEFT_DOWNなどのイベントを受け取ります。 event.Skip()を実行するメインコントロールのイベントを接続しようとしましたが、それは役に立ちませんでした。

  • 私が代わりにwxControlから派生するために私のクラスを変更(もしくはwxFrame、または多分私が試した他の人の数)した場合、子供はを行う制御イベントを取得するが、全体の事はサイザーで展開されません。子供のコントロールがはるかに多くのスペースを占めるにもかかわらず、小さな箱(10-20平方フィックス)で描画されます。

アップデート:私の主な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.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() 
} 

:mangoMixerStripインスタンス自体は、私が接続して任意のイベントを取得しますそれに対して、その子コントロールそうではありません。

+1

wxPanelから派生させるのが正しい方法です。あなたのコントロールがイベントを受け取っていないのは不思議です。何が起こっているかを見るためにコードを投稿してください。 – ravenspoint

+0

がコードで更新されました。 – tacospice

答えて

0

コントロールは、パネルの親の子ではなく、wxPanelから派生したクラスの子である必要があります。

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

あなたはwxFrameを使用したい場合は、あなたもそうすることができ

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

でなければなりません。ただし、フレームを作成したら、フレームにサイザーを追加してからパネルを追加し、次に別のサイザーを追加する必要があります。次に、サイザー内にあなたが望むものを置くことができます。何らかの理由で、wxwidgetsは、サイザー、パネル、サイザーを配置しないと正しいサイズになりません。

+0

うわー!それは単純なものをする複雑な方法のように聞こえる! – ravenspoint

関連する問題