WxWidgets中的缓冲图像

时间:2011-12-02 13:54:58

标签: c++ wxwidgets

我正在尝试使用wxWidgets进行数字IC模拟。我对C ++有很好的了解,但wxwidgets相对较新。

作为第一步,我需要展示面包板。我的解决方案是

  • myFrame (扩展 wxframe ),创建类面包板的实例(扩展 wxpanel )。

  • 面包板有会员 wxMemoryDC bbBuffer

  • 面包板的构造函数中,我使用以下代码片段进行绘制

    wxBitmap bmp(660, 450, -1);
    bbBuffer.SelectObject(bmp);
    bbBuffer.SetBackground(*wxWHITE_BRUSH);
    bbBuffer.Clear();
    bbBuffer.SetPen(wxPen(wxColor(80, 80, 80), 1));
    bbBuffer.DrawRectangle(10, 10, 640, 430);//more functions like this one follow
    

在渲染功能中我这样做 -

void BreadBoard::render(wxDC &dc)
{
    dc.Blit(wxPoint(10, 20), bbBuffer.GetSize(), &bbBuffer, wxPoint(0, 0));
}

我还在 wxClientDC bbBuffer 上使用mouseEvent绘制电线(这太简单了,以后我会将其写入XML文件,但现在不是)

这是一个好的设计策略吗? 稍后它会变得复杂,所以我该怎么办?

1 个答案:

答案 0 :(得分:2)

就个人而言,我不会将类面包板作为wxPanel的扩展。使面包板只包含您的代码而不是混合物似乎更清晰。

您可以将面板创建为myFrame的子项。

class MyFrame {
    wxPanel * myPanel;
    ...
MyFrame::MyFrame(
    ...
    myPanel = new wxPanel(this,-1,wxPoint(0,0),wxSize(2400,1200)) ;
    ...

然后,当您准备好显示面包板的位图时,MyFrame的方法可以在面板上执行GetDC,并将图像从面包板的DC blit到面板的DC,或者将面板DC传递给面包板的方法class,以便面包板可以在不暴露其内存DC的情况下进行blit。

void MyFrame::Render()
{
    myBreadboard.Render( wxClientDC( myPanel ) );
}

有什么好处?

  • 无论如何,在我看来,概念上更清晰。

  • 更明显的是如何将面包板绘制到另一个DC,例如打印机。您只需将打印机DC传递给面包板blit方法即可。

我看到你的方法render()执行blit。关于这种方法的一些评论:

  • 您正在传入wxDC参数。这将是什么?我猜这通常是通过调用GetDC获得的wxDC - 这有点令人困惑和不必要。你可以在render()方法中调用GetDC,这会让你的代码变得更干净,但是现在你不能使用render来绘制除了面包板实现的面板之外的任何地方,这最终会成为障碍。

  • 您已经硬编码了绘制面包板的位置。馊主意!最好将位置作为参数传递,并使用合理的默认值。