我正在努力使用wxWidgets制作动画圆规。我已经尝试过将wxSVG与SVG图像一起使用,因此它可以随窗口扩展,它可以在Linux上运行,但在Windows下编译该库是一个问题,我放弃了这种方法。 我也试过使用wxArt2D,但即使在Linux下它也没有编译。 现在我使用wxDC和wxImage,但它没有在rescale上刷新,并且它有很大的CPU开销(笔记本电脑i7使用了大约30%)。这是我的代码:
void MyFrame::OnPanel2EraseBackground(wxEraseEvent& event)
{
}
void MyFrame::OnPanel2Resize(wxSizeEvent& event)
{
wxSize panelSize = event.GetSize();
gaugeBuffer = gaugeImg.Scale(panelSize.GetX(), panelSize.GetY(), wxIMAGE_QUALITY_HIGH);
needleBuffer = needleImg.Scale(panelSize.GetX(), panelSize.GetY(), wxIMAGE_QUALITY_HIGH);
}
void MyFrame::OnPanel2Paint(wxPaintEvent& event)
{
wxPaintDC dc(Panel2);
wxPoint offset;
wxSize drawSize = dc.GetSize();
memDC.Clear();
temp = needleBuffer.Rotate((angle*M_PI/180), wxPoint((drawSize.GetX()/2), (drawSize.GetY()/2)), true, &offset);
memDC.DrawBitmap(gaugeBuffer, 0, 0);
memDC.DrawBitmap(temp, offset);
dc.Blit(0, 0, drawSize.GetX(), drawSize.GetY(), &memDC, 0, 0);
}
答案 0 :(得分:0)
我在代码中没有看到任何明显错误的内容,但每次重绘时旋转图像显然不会很快(特别是如果它们很大)并且你很可能会在任何已经加倍缓冲wxPaintDC
的现代系统上进行三重缓冲(即超过需要),请参见wxAutoBufferedPaintDC以避免它,同时仍确保为旧系统进行双缓冲或仅如果您不关心它们,请删除额外的内存DC。
您还可以查看wxActivityIndicator implementation以获取类似的替代方法,这种方法不会遇到任何严重的性能缺陷。