wxwidgets自定义控件大小无法设置。我错过了什么

时间:2009-10-13 13:50:20

标签: custom-controls wxwidgets sizer

我在一个带有垂直分级器的对话框中有一个来自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。

可能缺少什么?

1 个答案:

答案 0 :(得分:4)

您没有提供有关wxWidgets版本或平台/编译器的任何信息,因此我将回答wxWidgets 2.8和MSW。

您指定的大小不一定用于控件,因为不同平台的最佳大小可能会有所不同。即使在Windows上,大小通常也取决于默认的GUI字体。因此,wxWidgets中有各种方法可让windows指定其最小,最佳或最大大小。如果您有特殊要求,可能需要覆盖其中一些。

对于您的问题,您似乎希望控件的大小小于默认的最佳大小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)。 wxWindowwxControl的父类,因此该方法确实是虚拟的,您当然可以覆盖它。事实上,许多控件确实存在,因为源中的grep会向您显示。