2

私は教育目的でいくつかのwxWidgetsサンプルを書いています。私の問題は単純です。wxNotebookを使用しています。単一のタブの現在のサイズ、特に高さを取得するには、いくつかのトリックが必要です。簡単に言うと、たとえば、彼のwxMenubar(明らかに高さで発生する)を持つwxFrame内にwxNotebookを配置すると、タブの高さの値のみが取得され、wxMenubarのサイズも含まれるwxFrameの高さの値は取得されません。 。新しいコンポーネントを適切に中央に配置するには、この情報が必要です。

例については、以下のサンプルコードを参照してください。

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

ご覧のとおり、レイアウトは不完全です。ps wxGridBagSizerを使用してコンポーネントを中央に配置する別のより効率的な方法を知っている場合は、私に知らせてください。

4

1 に答える 1

0

グリッドバッグ レイアウトのセルをセンタリングするには、グリッドの列または行に「拡張可能」というラベルを付けます。グリッド セルが拡張可能としてラベル付けされている場合、すべてのセルは、親ウィンドウによって与えられたすべてのスペースを占めるように拡張されます (親ウィンドウのサイズが変更されると、セルのサイズも自動的に変更されます)。たとえば、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);

ここでは、3 つの列が作成されます。列ごとに AddGrowableCol() メソッドを呼び出して、列を展開する必要があります。比率変数は、各列が他のすべての列に対してどれだけ大きくなければならないかを示します。この場合、中央の列は他の列の 2 倍の大きさになります。AddGrowableRow メソッドは、列が親パネルの高さ全体を占めるようにします。

于 2011-08-22T21:00:08.770 に答える