为何仅最后一个wxStaticBitmap显示?同一图片需多位置展示
问题原因及解决办法
核心原因
你遇到的问题是因为同一个wxBitmap(假设drawPane->getImage()返回的是wxBitmap实例)无法被多个wxStaticBitmap控件直接共享使用:
- wxWidgets的
wxBitmap内部采用资源所有权机制,当你把它传给第一个wxStaticBitmap时,该控件会接管这个位图的底层资源。等你再把同一个位图传给第二个控件时,它拿到的已经是一个无效的空位图,所以第一个控件无法显示。 - 如果
getImage()返回的是wxImage,每次传给wxStaticBitmap时都会临时转为wxBitmap,但第一次转换可能会改变原wxImage的状态,导致第二次转换失败。
解决方法
要让两个控件都显示图片,你需要为每个wxStaticBitmap创建独立的位图副本:
void AppFrame::OnButtonClicked(wxCommandEvent& evt) { Tiles* knots = new Tiles(panel, 1); string tile = knots->firstTile(); ImagePanel* drawPane = new ImagePanel(panel, tile, wxBITMAP_TYPE_PNG); // 获取原始位图后,为每个控件复制一份独立的位图 wxBitmap originalBitmap = drawPane->getImage(); wxStaticBitmap* image1 = new wxStaticBitmap(panel, wxID_ANY, wxBitmap(originalBitmap), wxPoint(Background::defaultStartX, Background::defaultStartY), wxSize(100, 100)); wxStaticBitmap* image2 = new wxStaticBitmap(panel, wxID_ANY, wxBitmap(originalBitmap), wxPoint(Background::defaultStartX+100, Background::defaultStartY), wxSize(100, 100)); }
或者修改ImagePanel::getImage()方法,让它每次被调用时都返回一个新的wxBitmap副本,而不是同一个实例。
额外注意
你代码里new出来的Tiles、ImagePanel对象没有被添加到panel的子控件列表,也没手动管理内存,会造成内存泄漏。建议将它们的父控件设置为panel(让wxWidgets自动处理生命周期),或者在合适的时机手动删除这些对象。
内容的提问来源于stack exchange,提问作者Spooky
相关产品推荐
相关产品推荐

