0

当我使用 windows 经典主题设计 wxWidgets 对话窗口时,一切看起来都不错。

但是,当我在使用 aero 主题的机器上运行该应用程序时,空间会变大,并且项目开始在窗口底部下方消失。

这是 wxWidgets v2.9.4。wxWidgets v2.8.12下不会出现问题

这是同一对话框的屏幕截图,左侧为航空经典,右侧为经典。注意使用 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 经典设计的,并与 wxwidgets v2.9.3 链接。在同一主题下运行时看起来像这样:

在此处输入图像描述

但是,如果你停止应用程序,将主题更改为 aero,再次运行应用程序,它看起来像这样:

在此处输入图像描述

注意确定按钮几乎从对话框底部消失了。

(还要注意,您必须停止应用程序,更改主题,然后重新启动应用程序。只需在应用程序运行时更改主题即可。)

4

2 回答 2

2

GetSizer()->Fit()当您完成向布局添加控件时尝试使用(请参阅文档)。

于 2012-08-15T19:44:48.463 回答
-1

wxWidgets v2.9.4下默认字体大小在主题为'aero'时为9磅,但在主题为'windows classic'时为8磅。在 v2.8.12 中,无论使用什么主题,默认字体都是 8 磅。

结果是,如果我在一个主题下设计我的对话框布局,但用户使用不同的主题运行应用程序,则对话框的布局会有所不同。小部件需要更多或更少的空间,具体取决于主题。最糟糕的问题是,我通常放置在对话框底部的 OK/CANCEL 按钮会根据选择的主题出现或消失。这让用户很不爽!

将字体大小显式设置为 8 磅可解决此问题。

(这是怎么回事!!!!!!!!!!!!!!!我无法想象做出这种改变的理由,破坏了每一个升级的对话。)

显然这是微软的错——他们改变了默认字体大小以“提高可读性”。( http://en.wikipedia.org/wiki/Windows_Aero#Font ) 白痴!现在我必须在每个应用程序中指定字体大小,以便无论最终用户选择什么主题,对话框都具有相同的布局。叹!

如果不是这样的灾难,它可能会很有趣。wxWidgets 应该是跨平台的,但现在它甚至不再是跨主题了。

于 2012-08-15T21:48:41.870 回答