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 版本或您的平台/编译器的任何信息,所以我将回答 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()以返回您的预期大小,它应该可以工作。

编辑:

您评论说您不能覆盖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来源中的 a 将向您展示的那样。

于 2009-10-14T05:48:34.257 回答