2014-01-24 157 views
1

我有一個包含帶有ListBox和Panel的BoxSizer的Frame。我想以編程方式調整面板大小,然後強制框架調整大小。我可以調整面板的大小,但是如何強制BoxSizer或Frame調整大小?在調整子面板大小後強制調整Wx大小窗口

#!/usr/bin/perl 

use strict; 
use warnings; 
use Wx; 

package TestApp; 

use base qw (Wx::App); 
use Wx qw (wxMINIMIZE_BOX wxSYSTEM_MENU wxCAPTION wxCLOSE_BOX wxCLIP_CHILDREN); 

sub OnInit { 
    my $self = shift; 
    my $frame = TestFrame->new (
     undef, 
     -1, 
     'Test App', 
     [-1, -1], 
     [-1, -1], 
     wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN 
    ); 

    $frame->Show (1); 
    $self->SetTopWindow ($frame); 

    return 1; 
} 

package TestFrame; 

use base qw (Wx::Frame); 
use Wx::Event qw (EVT_MENU); 
use Wx qw (wxHORIZONTAL wxEXPAND wxALL wxBORDER_SIMPLE); 

our @id = (0 .. 100); 

sub new { 
    my $class = shift; 
    my $self = $class->SUPER::new (@_); 

    my $boxsizer = Wx::BoxSizer->new (wxHORIZONTAL); 

    my $listbox = Wx::ListBox->new (
     $self, 
     -1, 
     [-1, -1], 
     [64, -1] 
    ); 

    my $panel = Wx::Panel->new (
     $self, 
     -1, 
     [-1, -1], 
     [-1, -1], 
     wxBORDER_SIMPLE 
    ); 

    $boxsizer->Add (
     $listbox, 
     0, 
     wxEXPAND | wxALL, 
     5 
    ); 

    $boxsizer->Add (
     $panel, 
     0, 
     wxALL, 
     5 
    ); 

    my $menubar = Wx::MenuBar->new(); 
    my $menu = Wx::Menu->new(); 
    $menu->Append ($id[0], "Small Panel"); 
    $menu->Append ($id[1], "Large Panel"); 
    $menubar->Append ($menu, 'File'); 
    $self->SetMenuBar ($menubar); 

    $panel->SetClientSize (100, 200); 
    $self->SetSizerAndFit ($boxsizer); 

    EVT_MENU ($self, $id[0], sub { 
     $panel->SetMinSize ([-1, -1]); 
     $panel->SetClientSize ([100, 200]); 
     $panel->SetMinSize ($panel->GetClientSize()); 
     $self->SetClientSize ($boxsizer->GetSize()); 
     $self->Fit(); 
    }); 

    EVT_MENU ($self, $id[1], sub { 
     $panel->SetMinSize ([-1, -1]); 
     $panel->SetClientSize ([200, 300]); 
     $panel->SetMinSize ($panel->GetClientSize()); 
     $self->SetClientSize ($boxsizer->GetSize()); 
     $self->Fit(); 
    }); 

    return $self; 
} 

package main; 

my ($app) = TestApp->new(); 

$app->MainLoop(); 
+0

我已經改變了問題以提供一個完整的示例 –

回答

2

調用$self->Fit()將做到這一點只要你撥打$panel->SetMinSize()而不是SetClientSize()

下面的示例代碼與調整大小的面板大小調整菜單選項創建的應用程序。

+0

這似乎將幀調整爲原始大小,而不是新大小 –

+0

對不起,我沒有想到它,'Fit()'確實不夠如果您只設置了客戶端大小,因爲面板的最佳(最小)大小仍然保留其初始值。我已經編輯了答案,希望是正確的。 –

+0

添加$ panel-> SetMinSize($ panel-> GetSize())似乎在Windows下完美地工作。 在Linux(Fedora 20)上,我必須在調用SetClientSize之前添加$ panel-> SetMinSize([-1,-1])。然而,這似乎只是間歇性地工作(面板調整大小,但窗口沒有)。有沒有辦法解決這個問題在Linux上? –