質問

I have a Frame containing a BoxSizer with a ListBox and Panel. I want to programmatically resize the panel and then force the Frame to resize. I can resize the Panel as below, but how do I force the BoxSizer or Frame to resize?

The sample code below creates an application with a Resize menu option that resizes the panel:

#!/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 ();
役に立ちましたか?

解決

Calling $self->Fit() will do it provided you call $panel->SetMinSize() instead of SetClientSize().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top