【问题标题】:Why doesn't wxPerl draw my wxStaticBitmap when I run the program from a Windows shortcut?当我从 Windows 快捷方式运行程序时,为什么 wxPerl 不绘制我的 wxStaticBitmap?
【发布时间】:2011-01-07 18:40:12
【问题描述】:

我制作了一个 wxPerl 应用程序,它只显示了一个简单的框架,它只包含一个 wxMenuBar、wxPanel、wxTextCtrl 和一个 wxStaticBitmap。开发和部署平台是 Windows XP 及更高版本。

图像是这样添加到表单中的:

my $logoData = Wx::Bitmap->new(App::Resource::Images::getLogoPath(), wxBITMAP_TYPE_BMP);
my $logo = Wx::StaticBitmap->new($self, -1, $logoData);

我在显示图像时没有遇到任何问题。我用 Inno Setup 制作了一个安装程序,它在用户的桌面上添加了一个图标。如果应用程序使用该快捷方式启动,则窗口不会绘制我的 wxStaticBitmap。只有当应用程序失去焦点并且其他一些窗口被移动到它上面时,才会绘制我的 wxStaticBitmap。

从开始菜单启动应用程序时,快速启动,或者直接用 wxpar 编译它,或者只是用 perl 解释器显示我的 wxStaticBitmap 很好。

我唯一发现的是在我的 wxFrame 上调用 Refresh()Update()。创建这个 wxFrame 之后,我调用 Show(1),然后调用 Refresh()Update()。但到目前为止还没有运气。

【问题讨论】:

  • 快捷方式附加的工作目录是什么? getLogoPath() 是绝对的还是相对的?
  • getLogoPath() 实际上创建一个临时文件并且是绝对的。我为此使用 File::Temp 。加载图像似乎没有问题。因为一旦有什么东西触发了框架被重绘,一切都很好。
  • 另外,我应该补充一点,位图是在我的 Wx::Frame 派生类的构造函数中创建的。就像面板、文本控件等一样。

标签: windows perl wxwidgets wxperl


【解决方案1】:

wxStaticBitmap 是从 wxWindow 派生的,因此它同时具有 Update 和 UpdateWindowUI 方法。创建 $logo 后立即在 $logo 上调用其中一个会发生什么?

编辑:我刚试过,Update* 方法没有帮助。但是, 强制它重新绘制的是在创建对象后调用SetBitmap。这是我所做的:

my $bmp = Wx::Bitmap->new("./testcard.bmp", wxBITMAP_TYPE_BMP);
my $logo = Wx::StaticBitmap->new($frame, wxID_ANY, $bmp);
$logo->SetBitmap($bmp);

$frame 是一个Wx::Frame,我只是在一个sizer 中放了一个按钮,上面的代码在它的事件处理回调中。

【讨论】:

  • 当我把它放在一个事件中时,这似乎有帮助。但是,在创建对象之后,它似乎并没有什么不同。似乎当应用程序启动时焦点丢失然后返回。是否可以自动发出调用此方法的事件。也许每秒一次或两次?
  • 我不知道,我是 wxWidgets 的新手。我一直在试图弄清楚你是否可以自己生成事件。但至于绘图,您可能需要查看 wxDC(和 ::DrawBitmap),它可能会以不同方式处理位图的绘制。
  • FWIW,计时器可以像这样工作:my $timer = Wx::Timer->new($logo); EVT_TIMER($logo, $timer, sub { $logo->SetBitmap($bmp); });,但这种糟糕的形式可能有多种形式。
  • 对我来说没什么区别。但我会尝试通过使用计时器更新和刷新 gui 来解决这个问题。
  • 必须调用$timer->Start(500, wxTIMER_ONE_SHOT) 才能真正启动计时器。我本可以使用 wxTIMER_CONTINUOUS 但这会在图像中引入闪烁。目前这是最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多