Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WxWidgets中的缓冲图像_C++_Wxwidgets - Fatal编程技术网

C++ WxWidgets中的缓冲图像

C++ WxWidgets中的缓冲图像,c++,wxwidgets,C++,Wxwidgets,我正在尝试使用wxWidgets进行数字IC模拟。我有相当好的C++知识,但是WxWiGeDS是比较新的。 作为第一步,我需要显示一个试验板。我的解决办法是 类myFrame(扩展wxframe),创建类试验板的实例(扩展wxpanel) 试验板有成员 wxMemoryDC bbBuffer 在试验板的构造函数中我使用以下代码片段绘制 wxBitmap bmp(660, 450, -1); bbBuffer.SelectObject(bmp); bbBuffer.SetBackground(*

我正在尝试使用wxWidgets进行数字IC模拟。我有相当好的C++知识,但是WxWiGeDS是比较新的。 作为第一步,我需要显示一个试验板。我的解决办法是

  • 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));
}
我还在wxClientDCbbBuffer上使用mouseEvent绘制接线(这太简单了,稍后我会将其写入XML文件,但不是现在)

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

就我个人而言,我不会让类breadboard成为wxPanel的扩展。让breadboard简单地包含您的代码而不是一个混合体似乎更干净

可以将面板创建为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传递给breadboard blit方法

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

  • 您正在传入一个wxDC参数。这是什么?我猜这通常是通过调用GetDC获得的wxDC,这有点混乱,也没有必要。您可以在render()方法中调用GetDC,这会使代码更干净,但现在您不能使用render在任何地方进行绘制,除非绘制到由breadboard实现的面板,这最终会成为一个障碍

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


+1使用不同的工具包也很容易让您的试验板绘制-这不太可能,但能够做到这一点显示了代码的良好分区。@ravenpoint-谢谢,我将尝试您的建议。但作为myFrame的子对象创建面板,对我来说似乎并不合适。或者你是在建议组合?我的意思是:在窗口层次结构中,而不是在类层次结构中,创建一个wxPanel窗口作为MyFrame窗口的子窗口。这是标准的wxWidgets。我在回答中添加了一些示例代码。有关更多详细信息,请查看示例wxWidgets应用程序。现在我了解了。这是作文,不是吗?我一定会那样做的。