wxWidgets C ++面板是不可见的

时间:2016-12-01 23:40:02

标签: c++ wxwidgets

我开始用wxWidgets练习我的技能,我想在这个滑块上方添加一些带有两个不同文本的面板,但是当我尝试时,结果是不可见的:

MainWindow::MainWindow(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition) {
    wxMenuBar *menubar;
    wxMenu *file;
    menubar = new wxMenuBar;
    file = new wxMenu;
    file->Append(wxID_OPEN, wxT("&Open"));
    menubar->Append(file, wxT("&File"));
    SetMenuBar(menubar);

    wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
    this->SetSizer(vbox);
    player_widget = new wxWindow(this, wxID_ANY);
    player_widget->SetBackgroundColour(wxColour(wxT("black")));
    vbox->Add(player_widget, 1, wxEXPAND | wxALIGN_TOP);

    wxBoxSizer* bs = new wxBoxSizer(wxHORIZONTAL);
    wxPanel* p1 = new wxPanel(this,wxID_ANY,wxDefaultPosition,wxSize(0,20));
    p1->SetSizer(bs);
    p1->Enable(true);
    p1->Show(true);
    vbox->Add(p1,0,wxEXPAND);

    wxStaticText* text1 = new wxStaticText(this,11, "text 1");
    wxStaticText* text2 = new wxStaticText(this,12, "text 2");
    bs->Add(text1);
    bs->Add(text2);

    timeline = new wxSlider(this, myID_TIMELINE, 0, 0, TIMELINE_MAX);
    vbox->Add(timeline, 0, wxEXPAND);

    wxPanel *controlPanel = new wxPanel(this, wxID_ANY);
    wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
    controlPanel->SetSizer(hbox);
    vbox->Add(controlPanel, 0, wxEXPAND);
    playpause_button = new wxButton(controlPanel, myID_PLAYPAUSE, wxT("Play"));
    stop_button = new wxButton(controlPanel, myID_STOP, wxT("Stop"));
    volume_slider = new wxSlider(controlPanel, myID_VOLUME, VOLUME_MAX, 0, VOLUME_MAX, wxDefaultPosition, wxSize(100, -1));
    hbox->Add(playpause_button);
    hbox->Add(stop_button);
    hbox->AddStretchSpacer();
    hbox->Add(volume_slider);
}

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:0)

text1text2的父级更改为p1

答案 1 :(得分:0)

只使用一个可容纳所有内容的面板更简单。

像这样(一个完整的程序)

#include <wx/wx.h>
#include <wx/app.h>

class cApp : public wxApp
{
public:
    virtual bool OnInit();

};

#define TIMELINE_MAX 100
#define VOLUME_MAX 100

enum {
myID_TIMELINE,
myID_PLAYPAUSE,
myID_STOP,
myID_VOLUME
};

class cFrame: public wxFrame
{

    wxWindow * player_widget;
    wxSlider * timeline;
    wxSlider * volume_slider;
    wxButton * playpause_button;
    wxButton * stop_button;

public:
    cFrame(wxFrame *frame, const wxString& title)
        : wxFrame(frame, -1, title, wxPoint(-1,-1),wxSize(600,600))
        {
    wxMenuBar *menubar;
    wxMenu *file;
    menubar = new wxMenuBar;
    file = new wxMenu;
    file->Append(wxID_OPEN, wxT("&Open"));
    menubar->Append(file, wxT("&File"));
    SetMenuBar(menubar);

    // define one panel to hold everything
    // make it big enough to fill the frame
    wxPanel* p1 = new wxPanel(this,wxID_ANY, wxPoint(-1,-1),wxSize(600,600) );

    // top level sizer to hold everything
    wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);

    // add window widget at top
    player_widget = new wxWindow(p1, wxID_ANY);
    player_widget->SetBackgroundColour(wxColour(wxT("black")));
    vbox->Add(player_widget, 1, wxEXPAND | wxALIGN_TOP);

    // add some texts in a horizontal row
    wxBoxSizer* bs = new wxBoxSizer(wxHORIZONTAL);
    wxStaticText* text1 = new wxStaticText(p1,11, "text 1");
    wxStaticText* text2 = new wxStaticText(p1,12, "text 2");
    bs->Add(text1);
    bs->Add(text2);

    // add texts just below window widget
    vbox->Add( bs );

    // add slider below texts
    timeline = new wxSlider(this, myID_TIMELINE, 0, 0, TIMELINE_MAX);
    vbox->Add(timeline, 0, wxEXPAND);

    // some more controls in a row
    wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
    playpause_button = new wxButton(p1, myID_PLAYPAUSE, wxT("Play"));
    stop_button = new wxButton(p1, myID_STOP, wxT("Stop"));
    volume_slider = new wxSlider(p1, myID_VOLUME, VOLUME_MAX,
           0, VOLUME_MAX, wxDefaultPosition, wxSize(100, -1));
    hbox->Add(playpause_button);
    hbox->Add(stop_button);
    hbox->AddStretchSpacer();
    hbox->Add(volume_slider);

    // add controls below big slider
    vbox->Add( hbox );

    // make everything happen
    SetSizer(vbox);
        }
};

IMPLEMENT_APP(cApp);

bool cApp::OnInit()
{
    cFrame* frame = new cFrame(0L, _("wx Starter"));
    frame->Show();

    return true;
}

这给出了:

enter image description here

这是关于计算机编程的事情:在某些时候你总是需要安定下来并编写一些代码。所有那些承诺为你编写代码的应用程序,比如wxFormBuilder,都必须在某个时候放弃,你实际上必须做一些工作(Here is a link to more about this