wxPerl:添加在父框架调整大小时自动调整大小的组件

时间:2015-05-24 15:25:08

标签: perl fill expand wxperl

我是Perl的新手,我使用wxPerl来创建GUI应用程序。现在,我想在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;

不需要的结果:

unstretched

我想要的是在水平和垂直方向上拉伸红色面板,或者简而言之,我希望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);,但获得的帧与图像中的帧完全相同。

是否可以在BorderLayout中使用与wxPerl类似的内容?提前谢谢。

P.S。我知道有一个duplicate,但没有具体的答案......

1 个答案:

答案 0 :(得分:0)

<强>更新

如果您不知道,任何子窗口的默认大小调整器将使其填充其可用空间,因此为了达到您要求的所有效果,这是

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 strictuse warnings,它会帮助你很多!我和其他几个人不得不无休止地鼓励人们这样做,但有时似乎信息永远不会被传达。请尝试养成将这些语句添加到您编写的每个Perl程序的顶部的习惯,并帮助我们传播这个词

阻止您的程序运行有两件事

  • wxHORIZONTAL未定义,因为您尚未从Wx导入它,因此您将值0传递给Wx::BoxSizer->new而不会发出任何警告

  • 您已将第三个参数的值设为零$frameSizer->Add,这会阻止面板横向扩展到sizer的方向。您需要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;

<强>输出

Fixed WxWidgets screen http://bit.ly/1JNrrEL