2

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

这是一个最小的例子。

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)中的内容。

4

2 回答 2

2

你可以通过调用隐藏东西$thing->Show(0)。我补充说:

 $btn2->Show(0);

布局仍然有点有趣,因为小部件的空间仍然存在 - 它只是不可见。所以,它仍然是“放置”的。也许您想在其他可以自行调整大小的地方创建控件。

您必须在调用Layout.

请参阅使用 Sizer 隐藏控件

于 2020-05-17T15:42:34.497 回答
2

默认情况下会创建所有非顶级窗口。如果您不希望它们出现在屏幕上,则需要隐藏它们。最好的方法是在实际创建真实窗口之前隐藏它们,这可以在 C++ 中通过在不给它任何参数的情况下创建窗口然后使用创建窗口Create()时通常使用的相同参数调用来实现。

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

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

应该管用;

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

于 2020-05-17T15:37:27.707 回答