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 呼び出しが必要な理由は、私が困惑している問題の重要な手がかりになるのではないかと思います。

上記はwxWidgets v2.8.12使用時の挙動です。v2.9.3 にアップグレードしています。

新しいバージョンでは、Layout() を呼び出さない最初のコードは、ウィジェットがすべて重なり合っているという同じ問題を示しています。v2.9.3 で layout() の呼び出しを追加すると、ウィジェットがまったく表示されなくなり、パネルが完全に空白になります。

4

1 に答える 1

4

SetSizer()意図的にレイアウトを行わず、ウィンドウのサイズが変更されたときにのみ発生します。EVT_SIZEしかし、新しく作成されたウィンドウが表示された直後に常に , を取得することもあります。そのため、ユーザーがそれを見るまでに、既にレイアウトされています (そして、これがSetSizer()それを行わない理由です: これは無駄です。いずれにせよ、99% のケースですぐにやり直されます)。

あなたの場合、パネルは何らかの理由でこのサイズのイベントを取得しません。おそらく、コードの残りの部分を見ると、それが何であるかがわかり、それを避けることができます。しかし、そうでない場合は、電話Layout()も良い解決策です。ただし、サイザーではなく、パネル自体で同じメソッドを呼び出す必要があります。

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