c++ - WxWidgets 中的缓冲图像

标签 c++ wxwidgets

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

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

  • myFrame(扩展 wxframe),创建类 breadboard 的实例(扩展 wxpanel ).

  • breadboard 有成员 wxMemoryDC bbBuffer

  • breadboard 的构造函数中,我使用以下代码片段绘制

    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));
}

我还在wxClientDCbbBuffer上使用mouseEvent画线(这太简单了,稍后我会把它写到XML文件,但不是现在)

这是一个好的设计策略吗? 后面会越来越复杂,那我该怎么办呢?

最佳答案

就我个人而言,我不会让 class breadboard 成为 wxPanel 的扩展。让面包板只包含您的代码而不是混合代码似乎更干净。

您可以创建一个面板作为 myFrame 的子项。

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

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

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

有什么优势?

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

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

我看到您的方法 render() 执行 blit。对该方法的一些评论:

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

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

关于c++ - WxWidgets 中的缓冲图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8357382/

相关文章:

c++ - 我在 C++ 中的二维数组高斯模糊函数有什么问题?

c++ - 字符串的异常行为

c++ - WxWidgets:麻烦调用 wx Frame Constructor

c++ - C++ 标准库线程安全吗?

c++ - 为什么从 'const reference to base' 对象初始化 'constexpr derived' 对象不会产生常量表达式?

php - PHP 的 WxStyledTextCtrl 代码折叠

erlang - 如何在带有erlang的wxWidget的窗口中画一条线?

c++ - std::min/std::max 作为模板比较器

c++ - wxWidgets:对 wxURL 的 undefined reference