我在一个带有垂直分级器的对话框中有一个来自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。
可能缺少什么?
答案 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
)。 wxWindow
是wxControl
的父类,因此该方法确实是虚拟的,您当然可以覆盖它。事实上,许多控件确实存在,因为源中的grep
会向您显示。