2017-05-01 2 views
-3

여러 컨트롤의 배경을 다른 색상으로 채워야합니다. 여기 내 시도 :어떻게 wxBoxSizer의 배경을 채우시겠습니까?

#include "wx/wx.h" 
#include <wx/dataview.h> 
#include <wx/spinctrl.h> 
#include <algorithm> 

class MyApp : public wxApp 
    { 
    public: 
     virtual bool OnInit() wxOVERRIDE; 
    }; 

wxIMPLEMENT_APP(MyApp); 

class MyFrame : public wxFrame 
    { 
    public: 
     MyFrame(const wxString& title) : wxFrame(nullptr, wxID_ANY, title),flag(false) 
      { 
      wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); 
      bSizer1 = new wxBoxSizer(wxVERTICAL); 
      bSizer2 = new wxBoxSizer(wxVERTICAL); 
      wxStaticText* label = new wxStaticText(this, wxID_ANY, wxT("Some text"), wxDefaultPosition, wxDefaultSize, 0); 
      wxButton* button = new wxButton(this, wxID_APPLY, wxT("Swap"), wxDefaultPosition, wxDefaultSize, 0); 
      button->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) 
       { 
       this->Draw(); 
       }); 
      bSizer1->Add(label, 0, wxALIGN_CENTER|wxALL|wxSHAPED, 5); 
      topSizer->Add(bSizer1, 1, wxEXPAND, 5); 
      bSizer2->Add(button, 0, wxALIGN_CENTER|wxALL|wxSHAPED, 5); 
      topSizer->Add(bSizer2, 1, wxEXPAND, 5); 
      this->SetSizer(topSizer); 
      this->FitInside(); 
      this->Layout(); 
      Draw(); 
      } 
     void Draw() 
      { 
      wxColour col1(255, 255, 0), col2(0,0,255); 
      if(flag) 
       std::swap(col1,col2); 
      wxClientDC dc(this); 
      auto pos = bSizer1->GetPosition(); 
      auto size = bSizer1->ComputeFittingClientSize(this); 
      dc.SetBrush(wxBrush(col1)); 
      dc.DrawRectangle(pos, size); 
      pos = bSizer2->GetPosition(); 
      size = bSizer2->ComputeFittingClientSize(this); 
      dc.SetBrush(wxBrush(col2)); 
      dc.DrawRectangle(pos, size); 
      flag = !flag; 
      } 
    protected: 
     wxBoxSizer *bSizer1,*bSizer2; 
     bool flag; 
    }; 

bool MyApp::OnInit() 
    { 
    if (!wxApp::OnInit()) 
     return false; 

    MyFrame *frame = new MyFrame("MCVE"); 
    frame->Show(true); 
    return true; 
    } 

하지만 내가 원하는 것을하지 않습니다. wxBoxSizer에서 그런 메서드가 존재하지 않는다는 것을 알고 있으므로 잘못된 것입니다. 아마도 컨트롤 요소를 그룹화하는 다른 방법을 사용하는 것이 더 좋을까요?

+0

달성하고자하는 것에 대한 모형이 있습니까? 어쨌든 wxBoxSizer 및 웹에서 sizer에 대한 다른 자습서를 확인하십시오. – Igor

+0

@Igor 내가 문제를 잘못 설명했다고 생각합니다. 요소에 설정된 위치가 wxboxsizer라는 것을 알고 있지만 각 크기 조절기마다 빈 색상으로 채워야합니다. 내 MCVE에서는 단추를 누를 때 sizer로 정의 된 색상의 아래쪽과 위쪽 절반을 변경하기 만하면됩니다. – CamFerry

답변

3

사이퍼는 추상화이며 화면에 존재하지 않으므로 채울 수 없습니다. 그러나 창 배경을 채울 수 있으며 특별한 작업을 수행 할 필요가 없어도 SetBackgroundColour()으로 전화하십시오.

wxPanel을 만들고 배경색을 원하는대로 설정 한 다음이 패널의 하위 항목으로 필요한 창을 만들고 패널에 설정할 sizer를 사용하여 관리하십시오. 프레임 자체.

+0

죄송합니다, 이해가 확실하지 않습니다. 그래서 중간층으로 wxpanel을 추가해야합니까? – CamFerry

+0

좋은 예를 들어이 멋진 [튜토리얼] (http://zetcode.com/gui/wxwidgets/firstprograms/)을 발견 했으므로 지금 올바른 방법을 알고 있습니다. – CamFerry