You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何仅最后一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:50:31