1

Wx::StaticBoxSizer のサブクラスにイベント ハンドラを追加しようとしていますが、次のエラーが発生します。

C:/strawberry/perl/site/lib/Wx/Event.pm の 38 行目で、パッケージ「Wx::StaticBoxSizer」を介してオブジェクト メソッド「Connect」が見つかりません。

これは、Wx::StaticBoxSizer がイベントを処理できないということですか? もしそうなら、オブジェクトを自動的にサイズ変更して独自のイベントを処理するように構成する別の方法はありますか?

私のサブクラスコードは次のとおりです。必要に応じて、フレームとアプリ クラスも追加できます。

package my_sizer;
use base 'Wx::StaticBoxSizer';
use Wx qw(:sizer);
use Wx::Event qw(EVT_BUTTON);

sub new {
    my $ref = shift;
    my $parent = shift;

    my $self = $ref->SUPER::new(
        Wx::StaticBox->new($parent, -1, 'Box label'),
        wxHORIZONTAL
    );

    my $button = Wx::Button->new($parent, -1, 'Button');
    $self->Add($button);
    EVT_BUTTON($self, $button, \&click);

    $self->SetSizeHints($parent);

    return $self;
}

sub click { Wx::MessageBox('Click!'); }

ありがとう

4

1 に答える 1

1

私の質問はhttp://perlmonks.orgで回答されました。

sizer は、カスタム コントロールとしてサブクラス化するのにはあまり適していません。代わりに、Wx::Panel をサブクラスとして使用して独自のコントロールを作成する必要がありました。次に、コントロールに Wx::StaticBoxSizer を作成しました。

私の新しいコード:

package my_control;
use base 'Wx::Panel';
use Wx qw(:sizer :misc :id);
use Wx::Event qw(EVT_BUTTON);

sub new {
    my $ref = shift;
    my $parent = shift;
    my $self = $ref->SUPER::new($parent, wxID_ANY, wxDefaultPosition, wxDefaultSize);

    $self->{sizer} = Wx::StaticBoxSizer->new(
        Wx::StaticBox->new($self, -1, 'Box label'),
        wxHORIZONTAL
    );

    $self->{button} = Wx::Button->new($self, -1, 'Button');
    $self->{sizer}->Add($self->{button}, 1, wxEXPAND | wxALL, 10);
    EVT_BUTTON($self, $self->{button}, \&click);

    $self->SetSizerAndFit($self->{sizer});

    return $self;
}

sub click { Wx::MessageBox('Click!'); }
于 2010-06-24T16:39:51.743 に答える