使用wxWidgets进行测量

Gauge using wxWidgets

本文关键字:测量 wxWidgets 使用      更新时间:2023-10-16

我正在努力使用wxWidgets制作动画圆形gauge。我尝试过使用wxSVG和SVG图像,这样它就可以随窗口缩放,它在Linux上工作,但在Windows下编译该库是一个问题,我放弃了这种方法。我也尝试过使用wxArt2D,但它甚至在Linux下也没有编译。现在我正在使用wxDC和wxImage,但它不能在重新缩放时刷新,而且它有很大的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);
}

我看不出任何明显错误的代码,但旋转图像在每个重画显然是不会非常快(特别是如果他们大),你很可能在这里做三重缓冲(即一旦超过需要)在任何现代系统已经双缓冲wxPaintDC,看到wxAutoBufferedPaintDC办法避免它,同时确保双缓冲技术完成老系统或删除额外的内存DC如果你不关心他们。

您还可以查看wxActivityIndicator的实现,以寻找另一种方法来做类似的事情,而不会遭受任何严重的性能缺陷。