2011-12-02 108 views
0

我正在尝试使用wxWidgets进行数字IC仿真。我有很好的C++知识,但wxwidgets是相对较新的。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)); 
} 

我也画用的MouseEvent电线上wxClientDCbbBuffer(这是太简单了,以后我将其写入XML文件,但不是现在)

这是一个很好的设计策略? 后来它会变得复杂,所以我应该如何继续?

回答

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到方法的面包板类,以便面包板可以做blit而不暴露其内存DC。

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

有什么优点?

  • 无论如何,在我的脑海里,概念上更清晰。

  • 更明显如何绘制你的面包板到另一个DC,例如打印机。您可以简单地将打印机DC传递给面包板blit方法。

我看到你的方法render()做了blit。对此方法的一些评论:

  • 您正在传入一个wxDC参数。这将是什么?我猜测这通常是通过调用GetDC获得的wxDC--这是令人困惑和不必要的。你可以在render()方法内调用GetDC,这样可以使代码更加清晰,但现在除了面包板实现的面板之外,不能使用渲染器绘制任何地方,最终会成为一个障碍。

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

+0

+1也很容易让你的面包板使用不同的工具包 - 不是很可能,但能够做到这一点显示了良好的代码分区。 – phkahler

+0

@ravenspoint - 谢谢,我会尝试你的建议。但创建面板作为myFrame的孩子,似乎不适合我。或者你在暗示构图? –

+0

我的意思是:在窗口层次结构中创建一个wxPanel窗口作为MyFrame窗口的子项,而不是类层次结构。这是标准的wxWidgets。我在我的答案中添加了一些示例代码。有关更多详细信息,请参阅示例wxWidgets应用程序。 – ravenspoint