2011-08-22 4 views
2

저는 교육 목적으로 wxWidgets 샘플을 작성하고 있습니다. 내 문제는 간단합니다. 저는 wxNotebook을 사용하고 있으며, 하나의 탭, 특히 높이의 현재 크기를 얻으려면 트릭이 필요합니다. 간단히 말해 wxNotebook을 wxMenubar (wxMenubar - 예를 들어, 높이로 자리 잡음) 내에 배치하면 탭 높이 값만 가져오고 wxFrame 높이 값에는 크기도 포함됩니다. wxMenubar. 새 구성 요소를 적절히 맞추려면이 정보가 필요합니다.wxNotebook - 단일 탭의 높이 및/또는 wxSize 값을 얻는 방법은 무엇입니까?

예를 보려면 아래 예제 코드를 참조하십시오.

#include "wx/wx.h" 
#include "wx/gbsizer.h" 

class MyFrame : public wxFrame 
{ 
    public: 
     MyFrame() : wxFrame(NULL, wxID_ANY, wxT("Application"), wxDefaultPosition, wxSize(500, 300)) 
     { 
      wxNotebook *tabs = new wxNotebook(this, wxID_ANY, wxPoint(-1,-1), wxSize(-1,-1), wxNB_TOP); 

      wxPanel *extPanel = new wxPanel(tabs, wxID_ANY); // external panel will be directly added to wxNotebook 

      wxPanel *innerPanel = new wxPanel(extPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize); /* for now, innerPanel has default size */ 

      innerPanel->SetBackgroundColour(wxColor(0, 0, 255)); // I change background color for debug only 

      innerPanel->SetMinSize(wxSize(200, 200)); // I use SetMinSize() method to communicate to the sizer _required_ size for the panel 

      wxGridBagSizer *gbs = new wxGridBagSizer(3, 3); // I use a wxGridBagSizer to position one panel inside external 

      /* **** THE FOLLOWING IS THE CRITICAL LINE **** */   

      wxSize mainSize = this->GetSize(); /* for now, I get the _wxFRAME_ wxSize; I would get wxNOTEBOOK size instead */ 


      wxSize innPSize = innerPanel->GetMinSize(); // I get current (Min)Size of innerPanel 

      wxSize emptyCellSize((mainSize.GetWidth() - innPSize.GetWidth())/2, (mainSize.GetHeight() - innPSize.GetHeight())/2);  

      gbs->SetEmptyCellSize(emptyCellSize); // I Use SetEmptyCellSize() method to center the inner panel 

      gbs->Add(innerPanel, wxGBPosition(1, 1)); // 1, 1: central cell 
      extPanel->SetSizer(gbs); 

      tabs->AddPage(extPanel, wxT("Positioning test")); 

      Show(true); 
     } 
}; 

class MyApp : public wxApp 
{ 
    public: 
     virtual bool OnInit() 
     { 
      MyFrame *frame = new MyFrame(); 
     } 
}; 

IMPLEMENT_APP(MyApp); 

자세히 알 수 있듯이 레이아웃이 불완전합니다. p.s. wxGridBagSizer를 사용하여 컴포넌트를 중앙에 배치하는 또 다른 효율적인 방법을 알고 있다면 알려주십시오.

답변

1

그리드 백 레이아웃의 중심 셀은 그리드의 열 또는 행을 "확장 가능"으로 표시하여 수행 할 수 있습니다. 표 셀에 확장 가능으로 레이블이 지정되면 모든 셀이 부모 창에 의해 지정된 모든 공간을 차지하도록 확장됩니다 (또한 부모 창의 크기가 조정되면 셀의 크기가 자동으로 조정됩니다). 예를 들어, 3 개의 열이 있고 가운데 열을 가운데 맞춤하고자하면 다음을 수행 할 수 있습니다.

wxGridBagSizer *gbs = new wxGridBagSizer(3, 3); 
gbs->AddGrowableCol(0, 1); 
gbs->AddGrowableCol(1, 2); 
gbs->AddGrowableCol(2, 1); 
gbs->AddGrowableRow(0, 1); 
gbs->Add(new wxPanel, wxGBPosition(0, 0), wxDefaultSpan, 0); 
gbs->Add(innerPanel, wxGBPosition(0, 1), wxDefaultSpan, wxEXPAND | wxCENTER); 
gbs->Add(new wxPanel, wxGBPosition(0, 2), wxDefaultSpan, 0); 

여기서 세 개의 열이 생성됩니다. 각 열에 대해 AddGrowableCol() 메서드를 호출하여 열을 확장해야합니다. 비율 변수는 각 열이 다른 모든 열과 관련하여 얼마나 커야 하는지를 알려줍니다. 이 경우 중간 열은 다른 열보다 두 배 커집니다. AddGrowableRow 메서드는 열이 부모 패널의 전체 높이를 차지하도록합니다.

+0

이 솔루션은 나를 위해 작동하지 않으며 ... 전혀 작동하지 않습니다. 지시대로 코드를 변경하면 분할 오류가 발생합니다. –