2016-12-01 57 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