2014-01-24 115 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上? –