当我使用windows经典主题设计wxWidgets对话框窗口时,一切看起来都不错。
但是当我在使用aero主题的机器上运行应用程序时,空间会变大并且项目开始在窗口底部消失。
这是wxWidgets v2.9.4。在wxWidgets v2.8.12
下不会出现此问题以下是同一个对话框的屏幕截图,右侧是左侧经典版的aero。请注意使用aero时OK按钮的消失方式!
我该如何解决这个问题?我希望对话元素的间距在所有主题下都是相同的。
调用GetSizer() - > Fit()通过根据恰好使用的主题所需的空间调整整个窗口的大小来隐藏此问题。但是,我想更好地理解这个问题。我以像素为单位指定小部件周围的边框(5,10,无论如何),字体大小似乎没有改变(我认为),那么一个主题如何使用比另一个更多的空间呢?奇怪的事情正在发生!
以下是演示此问题的简单对话框的代码。
class cMyDialog : public wxDialog
{
public:
cMyDialog()
: wxDialog(NULL,-1,L"Test Dialog")
{
wxStaticText * text = new wxStaticText(this,-1,
L"Lorem ipsum dolor sit amet,\n"
L"consectetur adipiscing elit.\n"
L"Nulla porta aliquam urna,\n"
L"in aliquam massa mattis at.\n"
L"Lorem ipsum dolor sit amet,\n"
L"consectetur adipiscing elit.\n"
L"Nunc ullamcorper euismod lacus vel condimentum.\n"
L"Sed id magna ac nisl placerat tristique eu sit amet lorem.\n"
);
wxButton * button = new wxButton(this,-1,"OK");
wxSizer * szr = new wxBoxSizer(wxVERTICAL);
szr->Add( text, 0, wxALL, 20 );
szr->Add( button, 0, wxALL, 20 );
SetSizer( szr );
}
};
这是使用windows classic设计并与wxwidgets v2.9.3链接。在同一主题下运行时看起来像这样:
但是,如果你停止应用程序,将主题更改为aero,再次运行应用程序它看起来像这样:
注意OK按钮几乎从对话框的底部消失。
(另请注意,您必须停止应用程序,更改主题,然后重新启动应用程序。在应用程序运行时简单地更改主题不会导致任何问题。)
答案 0 :(得分:2)
在完成向布局添加控件(see docs)后尝试使用GetSizer()->Fit()
。
答案 1 :(得分:-1)
当主题为'aero'时,wxWidgets v2.9.4下的默认字体大小是9分,但当主题是'windows classic'时,它是8分。在v2.8.12中,无论使用什么主题,默认字体都是8分。
结果是,如果我在一个主题下设计我的对话框布局,但用户使用不同的主题运行应用程序,则对话框的布局不同。小部件需要更多或更少的空间,具体取决于主题。最糟糕的问题是我常常放在对话框底部的OK / CANCEL按钮将根据选择的主题显示或消失。这会让用户感到不安!
将字体大小明确设置为8个点可以解决问题。
(这是怎么回事!!!!!!!!!!!!!!我无法想象做出这样一个改变的理由,打破每个升级的对话框。)
显然这是微软的错 - 他们改变了默认字体'以提高可读性'。 ( {{3个白痴!现在我必须在每个应用程序中指定字体大小,以便无论最终用户选择什么主题,对话框都具有相同的布局。感叹!
如果不是这样的灾难,那可能会很有趣。 wxWidgets应该是跨平台的,但现在它甚至不再是跨主题的。