1

我有一个框架,其中包含一个带有 ListBox 和面板的 BoxSizer。我想以编程方式调整面板大小,然后强制框架调整大小。我可以如下调整面板的大小,但是如何强制 BoxSizer 或 Frame 调整大小?

下面的示例代码创建了一个具有调整面板大小的 Resize 菜单选项的应用程序:

#!/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 ();
4

1 回答 1

2

$self->Fit()如果您调用$panel->SetMinSize()而不是调用,调用将执行此操作SetClientSize()

于 2014-01-24T18:58:37.043 回答