Размер настраиваемого элемента управления wxwidgets не может быть установлен. Что я пропускаю - PullRequest
2 голосов
/ 13 октября 2009

У меня есть пользовательский элемент управления, полученный из 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). Если я изменю размер диалогового окна за пределы этого размера, он выравнивается по центру, как я указал.

EDIT: Я использую wx 2.8.9 на Windows Vista с Visual Studio 2005.

Чего не хватает?

1 Ответ

4 голосов
/ 14 октября 2009

Вы не предоставили никакой информации о версии wxWidgets или вашей платформе / компиляторе, поэтому я отвечу за wxWidgets 2.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(), чтобы вернуть желаемый размер, он должен работать.

Edit:

Вы комментируете, что не можете переопределить 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 в источниках покажет вам.

...