1

ニュースリーダーアプリケーションを作成していて、ニュースを表示するwxScrolledWindowがあります。ただし、カテゴリがあり、クリックすると、このパネルを現在のカテゴリのニュースで更新したいと思います。wxScrolledWindowでDeleteChildrenを使用してそれを達成しましたが、これはあまり正しく機能していないようです。

問題は、ニュースの再生中に点滅が発生し、ウィンドウ全体を伸ばさないとスクロールバーが表示されないことです。また、このマニュアルを実行しないと、ニュースのサイズ変更が表示されない場合があります。リフレッシュしてみましたが、それでも同じです。ここに私のコード:

our ($self);

sub new {
    my ($class, $parent_window) = @_;
    $self = $class->SUPER::new($parent_window, -1);
    $self->SetScrollRate(10, 10);

    my @news = (...);
    regenerate_news_list(@news);

    return $self;
}

sub regenerate_news_list($) {
    my (@news) = @_;

    $self->DestroyChildren();

    my $vbox = Wx::BoxSizer->new(wxVERTICAL);
    for my $news_item (@news) {

        my $news_panel = Wx::Panel->new($self, wxID_ANY);

        my $news_sizer = Wx::BoxSizer->new(wxVERTICAL);
        my $news_title = Wx::HyperlinkCtrl->new($news_panel, wxID_ANY, $news_item{'title'}, $news_item{'url'},  wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
        my $news_description = Wx::StaticText->new($news_panel, wxID_ANY, $news_item{'description'}, wxDefaultPosition);
        $news_description->Wrap(560);

        $news_sizer->AddSpacer(5);
        $news_sizer->Add($news_title, 0);
        $news_sizer->AddSpacer(5);
        $news_sizer->Add($news_description, 0);
        $news_sizer->AddSpacer(5);

        $vbox->Add($news_panel, 0, wxEXPAND|wxALL);
    }

    $self->SetSizer($vbox);
    $vbox->Fit($self);
    $self->Refresh();
}
4

2 に答える 2

3

$self->Freeze()beforeを呼び出しDestroyChildren()て更新を行う前に再描画を停止し、Thaw()完了したら after を呼び出しますRefresh()。はるかに高速で、ちらつきはありません。

于 2013-02-10T21:59:15.033 に答える
0

ユーザーに表示するパネルと、新しいディスプレイを準備するパネルの 2 つのパネルを使用します。新しい表示が完了したら、新しいパネルを表示し、古いパネルを非表示にします。代わりの。

于 2013-01-30T13:45:18.080 に答える