Wxperl 创建小部件但不放置它

Wxperl create widget but don't place it

如何在不将小部件放置在其父级上的情况下创建小部件?

这是一个最小的例子。

package MyApp;
use strict;
use warnings;
use Wx;
use base 'Wx::App';

sub OnInit {
    my ($self) = @_;
    my $frame
        = Wx::Frame->new( undef, -1, 'Test', [ -1, -1 ], [ 250, 150 ], );
    my $sizer = Wx::GridBagSizer->new( 0, 0 );

    my $btn1 = Wx::Button->new( $frame, -1, '1' );
    my $btn2 = Wx::Button->new( $frame, -1, '2' );

    $sizer->Add( $btn1, Wx::GBPosition->new( 2, 2 ) );
    $frame->SetSizer($sizer);
    $frame->Show(1);
    1;
}

package main;
MyApp->new->MainLoop;

这会产生

我只想显示 sizer(按钮 1)中的内容。

默认显示所有非顶级 windows。如果您不想让它们出现在屏幕上,您需要隐藏它们。最好的方法是在 before 实际创建真正的 window 之前隐藏它们,这可以在 C++ 中通过创建 window 而不给它任何参数来实现然后使用创建它时通常使用的相同参数调用 Create()

我不确定这是否在 wxPerl 中公开。如果是,像这样

    my $btn2 = Wx::Button->new();
    $btn2->Hide(); # or $btn2->Show(false)
    $btn2->Create($frame, -1, '2' );

应该可以;

如果没有,您仍然可以隐藏它,如果您在显示框架之前隐藏它,用户仍然看不到它。

您可以通过调用 $thing->Show(0) 隐藏内容。我补充说:

 $btn2->Show(0);

布局仍然有点有趣,因为小部件的 space 仍然存在 — 只是不可见。所以,还是"placed"。也许您想在其他地方创建您可以自行调整大小的控件。

您必须在调用 Layout 之前隐藏小部件。

Hiding Controls Using Sizers