wxPerl: добавить компонент, который автоматически изменяет размер при изменении размера родительского фрейма

Я относительно новичок в Perl, и я использую wxPerl создать приложение с графическим интерфейсом. Теперь я хочу добавить Panel в Frameвозможно используя sizer так что размер панели изменяется автоматически при изменении размера рамки.

Итак, вот что я получил:

(1) Я должен использовать BoxSizer, которые растягивают компоненты в одном направлении.

(2) Я должен передать параметры в Add подпрограммы для растягивания компонентов в другом направлении.

Я написал следующий код:

package Main;
use Wx;
use parent 'Wx::App';

sub OnInit {
    my $frame = Wx::Frame->new(undef, -1, "SimpleCalc ".$Information::VERSION_NO, [-1,-1], [-1,-1]);
    my $centerPanel = Wx::Panel->new($frame, -1, [-1,-1], [-1,-1]);
    #set red background
    $centerPanel->SetBackgroundColour(Wx::Colour->new(255,0,0));
    my $frameSizer = Wx::BoxSizer->new(wxHORIZONTAL);
    $frameSizer->Add($centerPanel, 1, 0, 0);
    $frame->SetSizer($frameSizer);
    $frame->Center();
    $frame->Show(1);
    return 1;
}

my $app = Main->new;
$app->MainLoop;

Нежелательный результат:

нерастянутая

Я хочу растянуть красную панель как в горизонтальном, так и в вертикальном направлении, или, короче говоря, я хочу что-то похожее на BorderLayout в Java,

Согласно некоторым онлайн-учебникам, я пытался заменить $frameSizer->Add($centerPanel, 1, 0, 0); с $frameSizer->Add($centerPanel, 1, wxEXPAND, 0);, но скрипт не запускается. Происходит ошибка, сообщающая, что не удается разрешить перегрузку для Wx::Sizer::Add(Wx::Panel, number, scalar, number). Я тоже пробовал $frameSizer->Add($centerPanel, 1, 0, 0, wxEXPAND);, но полученный кадр точно такой же, как кадр на изображении.

Возможно ли иметь что-то похожее на Java? BorderLayout в wxPerl? Заранее спасибо.

PS Я знаю, что есть дубликат, но нет конкретных ответов...

1 ответ

Решение

Обновить

В случае, если вы не знали, размер по умолчанию для любого дочернего окна заполнит его доступное пространство, поэтому для достижения эффекта, который вы запрашиваете, все, что вам нужно, это

use strict;
use warnings;

package Information;

our $VERSION_NO = 9.99;


package Main;
use Wx qw/ :colour /;
use parent 'Wx::App';

sub OnInit {

  my $frame = Wx::Frame->new(undef, -1, "SimpleCalc $Information::VERSION_NO");

  my $centerPanel = Wx::Panel->new($frame);
  $centerPanel->SetBackgroundColour(wxRED);

  $frame->Center;
  $frame->Show;

  return 1;
}

my $app = Main->new;
$app->MainLoop;

оригинал

Это очень помогло бы тебе, если бы ты use strict а также use warnings на месте! Я и несколько других должны бесконечно поощрять людей делать это, но иногда кажется, что сообщение никогда не будет донесено. Пожалуйста, постарайтесь добавлять эти утверждения в начало каждой написанной вами Perl-программы и помогать нам распространять информацию

Есть две вещи, мешающие вашей программе работать

  • Значение wxHORIZONTAL не определено, потому что вы не импортировали его из Wx, так что вы передаете нулевое значение Wx::BoxSizer->new без предупреждения

  • Вы использовали нулевое значение для третьего параметра $frameSizer->Add, что предотвращает поперечное расширение панели в направлении калибратора. Тебе нужно wxEXPAND там, чтобы включить его, и вам также нужно будет импортировать значение этой константы, конечно,

Вот переписать ваш код, который решает эти проблемы, а также использует преимущества по умолчанию, которые будут использоваться для пропущенных параметров. Я также использовал wxRED вместо создания нового Wx::Colour объект. Я должен был установить значение для $Information::VERSION_NO тоже

Этот код работает как вы ожидали

use strict;
use warnings;

package Information;

our $VERSION_NO = 9.99;


package Main;

use Wx qw/ :sizer :colour /;
use parent 'Wx::App';

sub OnInit {
    my $frame = Wx::Frame->new(undef, -1, "SimpleCalc $Information::VERSION_NO");

    my $centerPanel = Wx::Panel->new($frame);
    $centerPanel->SetBackgroundColour(wxRED);

    my $frameSizer = Wx::BoxSizer->new(wxHORIZONTAL);
    $frameSizer->Add($centerPanel, 1, wxEXPAND);
    $frame->SetSizer($frameSizer);

    $frame->Center;
    $frame->Show;

    return 1;
}

my $app = Main->new;
$app->MainLoop;

выход

http://bit.ly/1JNrrEL

Другие вопросы по тегам