wxWidgets:将位图图块绘制到wxPanel中

时间:2014-04-11 14:48:20

标签: c++ bitmap wxwidgets

所以我试图与玩家一起画出各种各样的舞台。我真的不知道发生了什么,但我认为这与wxMemoryDC绘制位图的速度有关。

我正在尝试将一大堆位图图块加载到面板中。下面是执行此操作的代码。建议更好的方式将不胜感激。我知道有一种方法可以用wxBufferedDC来做到这一点,但我无法弄清楚如何正确地做到这一点。

void RobotWarsFrame::OnButtonStartClick(wxCommandEvent& event)
{
    wxPaintDC dc(PanelArena);

    if (!dc.CanDrawBitmap())
    {
        wxMessageBox(wxT("ERROR"), wxT("Cannot draw bitmaps on panel"),wxICON_ERROR);
        Close();
    }

    for (short int row = 0; row < TOTAL_ROWS; row++)
    {
        for (short int column = 0; column < TOTAL_COLUMNS; column++)
        {
            wxString path(arena->getCell(row, column)->getContent()->getPathToImage().c_str(), wxConvUTF8);
            wxBitmap image(path, wxBITMAP_TYPE_BMP);
            if (!image.Ok())
            {
                wxString error;
                error.Printf(wxT("Image %s did not load"), path.c_str());
                wxMessageBox(error);
                Close();
            }
            dc.DrawBitmap(image, wxCoord(column * BITMAP_DIMENSIONS), wxCoord(row * BITMAP_DIMENSIONS), false);
        }
    }
}

程序在每次运行时在dc.DrawBitmap的不同点崩溃。如果我在每个dc.DrawBitmap之后停止它大约半秒钟就可以了。

我很沮丧。

1 个答案:

答案 0 :(得分:0)

你的代码是非常低效的,因为你应该真正缓存位图而不是在每次绘制期间从文件中加载它们(可能很多次),但这不应该使它崩溃。

很难知道为什么会崩溃,因为您显示的代码中没有任何明显错误。你真的应该在调试器下运行你的程序,并在崩溃时查看堆栈跟踪,它几乎肯定会有一些有价值的信息。