的wxWidgets仪不会自动布局

问题描述:

这是我的代码:的wxWidgets仪不会自动布局

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只小部件整齐地排成一列。

enter image description here

不过,我竟然得到的是所有的部件堆一个在其他

enter image description here

为什么之上?

我可以通过向仪)的显式调用::布局(

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); 
    } 

我可以用这个实况力量正确的显示,但在我看来,它应该是不必要的呼叫布局。我也怀疑布局调用的必要性可能是解决我难以解决的问题的重要线索。

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

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

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

在你的情况下,面板不管出于什么原因都没有得到这个大小的事件。也许 - 看你的代码的其余部分 - 你可以看到它是什么,并避免它。但如果不是,拨打Layout()也是一个很好的解决方案。除了你应该在面板本身调用相同的方法,而不是在调整器上,即做

cLicensePanel::cLicensePanel(wxWindow * parent) 
{ 
    ... 
    SetSizer(szrUserKey); 
    Layout(); 
}