2

wxControl から派生したカスタム コントロールがあり、垂直方向のサイザーを含むダイアログ内にあります。

wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
Knob* newKnob = new Knob(panel,wxID_ANY,wxDefaultPosition,wxSize(40,40));
topSizer->Add(newKnob,0,wxALL|wxALIGN_CENTER);
panel->SetSizer(topSizer);
topSizer->Fit(panel);

//panel is a wxPanel inside the dialog

しかし、何らかの理由で、カスタム コントロールのサイズが (80,100) に設定されています。そのサイズを超えてダイアログのサイズを変更すると、指定したとおりに中央に配置されます。

編集: Visual Studio 2005 を搭載した Windows Vista で wx 2.8.9 を使用しています。

何が欠けている可能性がありますか?

4

1 に答える 1

4

wxWidgetsのバージョンやプラットフォーム/コンパイラに関する情報を提供しなかったので、wxWidgets2.8とMSWについて回答します。

プラットフォームごとに最適なサイズが異なる可能性があるため、指定したサイズが必ずしもコントロールに使用されるとは限りません。Windowsでも、サイズは通常、デフォルトのGUIフォントによって異なります。そのため、wxWidgetsには、ウィンドウが最小、最適、または最大サイズを指定できるようにするさまざまなメソッドがあります。特別な要件がある場合は、それらの一部をオーバーライドする必要がある場合があります。

wxControlあなたの問題では、コントロールのサイズをデフォルトの最適サイズである:よりも小さくしたいようです。

wxSize wxControl::DoGetBestSize() const
{
    return wxSize(DEFAULT_ITEM_WIDTH, DEFAULT_ITEM_HEIGHT);
}

(から取得src/msw/control.cpp)と値

#define DEFAULT_ITEM_WIDTH  100
#define DEFAULT_ITEM_HEIGHT 80

(から取得include/wx/msw/private.h)。

オーバーライドDoGetBestSize()して目的のサイズを返すと、機能するはずです。

編集:

DoGetBestSize()では仮想ではないため、オーバーライドできないとコメントしていますwxControl。それはで紹介されているので、それはですがwxWindow

// get the size which best suits the window: for a control, it would be
// the minimal size which doesn't truncate the control, for a panel - the
// same size as it would have after a call to Fit()
virtual wxSize DoGetBestSize() const;

(から取得include/wx/window.h)。wxWindowはの親クラスでwxControlあるため、メソッドは実際に仮想であり、もちろんオーバーライドできます。ソースのがあなたに示すように、多くのコントロールは実際にそうしgrepます。

于 2009-10-14T05:48:34.257 に答える