2016-12-01 59 views
0

我开始练习我与wxWidgets的技能,我想补充一些面板使用滑动条上述两种不同的文本,但是当我尝试过,结果是无形的:wxWidgets的C++面板是无形

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); 
} 

任何想法我做错了什么?

+1

对于设计GUI,您可能需要考虑使用wxFormBuilder,然后复制并粘贴代码。 – macroland

+0

或者wxGlade或wxCrafter – Igor

回答

0

text1text2的父项更改为p1

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

+0

你是对的。然而,对于一个刚刚接触wx框架并希望学习和理解的人来说,使用工具然后查看生成的代码更容易,然后从第1天起从头开始编写sizer代码。您不同意吗? – Igor

+1

对不起,我不同意。查看由自动代码生成器生成的代码是没有用的。自动代码被设计为易于由代码生成器维护 - 不是用于教学目的。新手编码器最好查看样本代码,这些代码由人类编写,旨在从人类身上学习。 – ravenspoint