为什么我用Windows快捷方式运行程序时,wxPerl不能绘制wxStaticBitmap?

3
我已经制作了一个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()是绝对路径还是相对路径? - user240438
getLogoPath() 实际上创建了一个临时文件并且是绝对路径。我使用 File::Temp 来实现这个功能。加载图像似乎没有问题。因为一旦某些东西触发了帧的重绘,一切都会恢复正常。 - Htbaa
另外,我应该补充的是,位图是在我的 Wx::Frame 派生类的构造函数中创建的,就像面板、文本控件等一样。 - Htbaa
1个回答

1

wxStaticBitmap继承于wxWindow,因此具有Update和UpdateWindowUI方法。当您在创建$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 中放置了一个按钮,并将上述代码放在它的事件处理程序回调中。


当我将这个放在一个事件中时,它似乎有所帮助。然而,在创建对象之后,它似乎没有任何区别。似乎当应用程序启动时,焦点丢失然后重新获得。是否可能自动触发一个调用此方法的事件?也许每秒一次或两次? - Htbaa
我不太清楚,因为我对wxWidgets还比较陌生。我一直在尝试弄清楚是否可以自己生成事件。但是至于绘图,你可能需要看看wxDC(和::DrawBitmap),它们可能会以不同的方式处理位图绘制。 - Anonymous
就此而言,计时器可以像这样工作:my $timer = Wx::Timer->new($logo); EVT_TIMER($logo, $timer, sub { $logo->SetBitmap($bmp); });,但是可能存在多种不良形式。 - Anonymous
对我来说没什么区别。但我会尝试使用定时器更新和刷新GUI,看看能否解决这个问题。 - Htbaa
必须调用 $timer->Start(500, wxTIMER_ONE_SHOT) 才能真正启动计时器。我本可以使用 wxTIMER_CONTINUOUS,但这会在图像中引入闪烁。目前这是最好的解决方案。 - Htbaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接