【问题标题】:Force window to resize in Wx after resizing a child panel调整子面板大小后强制窗口在 Wx 中调整大小
【发布时间】:2014-02-15 17:00:48
【问题描述】:

我有一个包含 BoxSizer 和 ListBox 和 Panel 的 Frame。我想以编程方式调整面板大小,然后强制框架调整大小。我可以如下调整 Panel 的大小,但是如何强制 BoxSizer 或 Frame 调整大小?

下面的示例代码创建了一个带有调整面板大小的 Resize 菜单选项的应用程序:

#!/usr/bin/perl

use strict;
use warnings;
use Wx;

package TestApp;

use base qw (Wx::App);
use Wx qw (wxMINIMIZE_BOX wxSYSTEM_MENU wxCAPTION wxCLOSE_BOX wxCLIP_CHILDREN);

sub OnInit {
    my $self  = shift;
    my $frame = TestFrame->new (
        undef,
        -1,
        'Test App',
        [-1, -1],
        [-1, -1],
        wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN
    );

    $frame->Show (1);
    $self->SetTopWindow ($frame);

    return 1;
}

package TestFrame;

use base qw (Wx::Frame);
use Wx::Event qw (EVT_MENU);
use Wx qw (wxHORIZONTAL wxEXPAND wxALL wxBORDER_SIMPLE);

our @id = (0 .. 100);

sub new {
    my $class = shift;
    my $self  = $class->SUPER::new (@_);

    my $boxsizer = Wx::BoxSizer->new (wxHORIZONTAL);

    my $listbox = Wx::ListBox->new (
        $self,
        -1,
        [-1, -1],
        [64, -1]
    );

    my $panel = Wx::Panel->new (
        $self,
        -1,
        [-1, -1],
        [-1, -1],
        wxBORDER_SIMPLE
    );

    $boxsizer->Add (
        $listbox,
        0,
        wxEXPAND | wxALL,
        5
    );

    $boxsizer->Add (
        $panel,
        0,
        wxALL,
        5
    );

    my $menubar = Wx::MenuBar->new ();
    my $menu = Wx::Menu->new ();
    $menu->Append ($id[0], "Small Panel");
    $menu->Append ($id[1], "Large Panel");
    $menubar->Append ($menu, 'File');
    $self->SetMenuBar ($menubar);

    $panel->SetClientSize (100, 200);
    $self->SetSizerAndFit ($boxsizer);

    EVT_MENU ($self, $id[0], sub {
        $panel->SetMinSize ([-1, -1]);
        $panel->SetClientSize ([100, 200]);
        $panel->SetMinSize ($panel->GetClientSize ());
        $self->SetClientSize ($boxsizer->GetSize ());
        $self->Fit ();
    });

    EVT_MENU ($self, $id[1], sub {
        $panel->SetMinSize ([-1, -1]);
        $panel->SetClientSize ([200, 300]);
        $panel->SetMinSize ($panel->GetClientSize ());
        $self->SetClientSize ($boxsizer->GetSize ());
        $self->Fit ();
    });

    return $self;
}

package main;

my ($app) = TestApp->new ();

$app->MainLoop ();

【问题讨论】:

  • 我已更改问题以提供完整示例

标签: wxwidgets wxperl


【解决方案1】:

只要您调用$panel->SetMinSize() 而不是SetClientSize(),就可以调用$self->Fit()

【讨论】:

  • 这似乎将 Frame 调整为原始大小,而不是新大小
  • 对不起,我没有想通,Fit() 确实不够,如果你只设置客户端大小,因为面板的最佳(又名最小)大小仍然保留其初始值。我已经编辑了答案,希望它是正确的。
  • 添加 $panel->SetMinSize ($panel->GetSize ()) 在 Windows 下似乎可以完美运行。在 Linux (Fedora 20) 上,我必须在调用 SetClientSize 之前添加 $panel->SetMinSize ([-1, -1])。然而,这似乎只是间歇性地工作(面板调整大小但窗口没有)。有什么办法可以在 Linux 上解决这个问题?
  • 我真的不明白为什么在 Unix 下的行为会有所不同,为什么你必须添加重置最小大小的调用?
  • 当我使面板小于原始面板时,Linux 中没有任何反应,除非我重置最小尺寸(Windows 可以在没有此行的情况下正常工作)。使用这条线,它可能有 50% 的时间工作,所以它可能是 wxperl 与 GTK+ 交互方式的错误
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2019-05-15
  • 2012-10-29
相关资源
最近更新 更多