【问题标题】:wxPerl: add component which resizes automatically when parent frame gets resizedwxPerl:添加在父框架调整大小时自动调整大小的组件
【发布时间】:2015-08-06 03:46:20
【问题描述】:

我对 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;

不想要的结果:

我想要的是在两个(水平和垂直)方向上拉伸红色面板,或者简而言之,我想要类似于 Java 中的 BorderLayout 的东西。

根据一些在线教程,我尝试将$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);,但是得到的帧和图片中的帧一模一样。

是否有可能在wxPerl 中有类似于Java 的BorderLayout 的东西?提前致谢。

附:我知道有一个duplicate,但没有具体的答案...

【问题讨论】:

    标签: perl fill expand wxperl


    【解决方案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 strictuse 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;
    

    输出

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

    【讨论】:

    • 谢谢!还有一件事要问:是否有任何全面的文档可以说明变量的定义位置?
    • @tony200910041:你的意思是常量,比如wxHORIZONTAL?它们在 wxWidgets 库中定义。它们被Constants.xs 中的代码从wxWidgets 包含目录中的各种C 头文件中拉入Wx 模块。如果您想要有关如何使用它们的文档,那么最好的地方是wxWidgets documentation
    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多