1

这是我的代码:

cLicensePanel::cLicensePanel( wxWindow * parent )
        : wxPanel(parent,-1,wxPoint(0,0),wxSize(500,500))
    {
        wxBoxSizer * szrUserKey = new wxBoxSizer(wxHORIZONTAL);
        myUserKeyCtrl = new wxTextCtrl(this,-1,L"");
        szrUserKey->Add( new wxStaticText(this,-1,wxString(L"User's ComputerKey:")),
                   0,wxALL,10);
        szrUserKey->Add( myUserKeyCtrl,0,wxALL,10);
        szrUserKey->Add( new wxButton(this,IDC_Generate,L"Generate"),0,wxALL,10);
        SetSizer( szrUserKey );
    }

这是为了制作这个显示,3 个小部件整齐地排列成一排。

在此处输入图像描述

然而,我实际上得到的是所有的小部件一个一个堆叠在一起

在此处输入图像描述

为什么?

我可以通过显式调用 Sizer::Layout() 来强制正确显示

cLicensePanel::cLicensePanel( wxWindow * parent )
        : wxPanel(parent,-1,wxPoint(0,0),wxSize(500,500))
    {
        wxBoxSizer * szrUserKey = new wxBoxSizer(wxHORIZONTAL);
        myUserKeyCtrl = new wxTextCtrl(this,-1,L"");
        szrUserKey->Add( new wxStaticText(this,-1,wxString(L"User's Computer Key:")),0,wxALL,10);
        szrUserKey->Add( myUserKeyCtrl,0,wxALL,10);
        szrUserKey->Add( new wxButton(this,IDC_Generate,L"Generate"),0,wxALL,10);
        szrUserKey->Layout();
        SetSizer( szrUserKey );
    }

我可以忍受这一点,尽管在我看来应该没有必要调用 Layout. 我还怀疑 Layout 调用是必要的原因可能是解决让我难过的问题的重要线索。

以上是使用 wxWidgets v2.8.12 时的行为。我正在升级到 v2.9.3。

在新版本中,没有调用 Layout() 的初始代码显示了相同的问题,所有小部件都堆叠在一起。如果我在 v2.9.3 中添加对 layout() 的调用,那么我根本看不到任何小部件 - 面板显示完全空白!

4

1 回答 1

4

SetSizer()故意不进行布局,仅在调整窗口大小时才会发生。但是也碰巧一个新创建的窗口总是在EVT_SIZE显示后很快得到一个 , 所以当用户看到它时,它已经布置好了(这就是SetSizer()不这样做的原因:这将是浪费无论如何,在 99% 的情况下都会很快重做)。

在您的情况下,无论出于何种原因,面板都没有收到此大小事件。也许——看看你的其余代码——你可以看到它是什么并避免它。但如果没有,打电话Layout()也是一个很好的解决方案。除了你应该在面板本身上调用相同的方法,而不是在 sizer 上,即做

cLicensePanel::cLicensePanel( wxWindow * parent )
{
    ...
    SetSizer(szrUserKey);
    Layout();
}
于 2012-07-10T14:27:54.687 回答