2012-04-10 60 views
0

为了摆脱闪烁,我使用wxBufferedPaintDC来代替wxPaintDC。但是有一个问题。在我的绘画函数中,为了绘制立方beizer曲线,我必须使用GetGraphicsContext来创建路径。我的问题是为什么GetGraphicsContext在使用wxBufferedPaintDC时返回NULL指针。wxBufferedPaintDC GetGraphicsContext返回NULL指针

void DotGraphView::OnPaint(wxPaintEvent & WXUNUSED(evt)) 
{ 
    wxBufferedPaintDC dc(this); 

    PrepareDC(dc); 

    PaintBackground(dc); 

    wxGCDC &gdc = (wxGCDC&)dc; 
    wxGraphicsContext * gc = gdc.GetGraphicsContext(); /* here gc = NULL */ 
    wxGraphicsPath path = gc->CreatePath(); /* program collapses here */ 

    ... 
} 

回答

0

,你必须从wxBufferedPaintDCwxGCDC演员看起来有点可疑对我来说,wxGraphicsContext页建议做这样的:

wxGraphicsContext *gc = wxGraphicsContext::Create(dc); 
if (gc) 
{ 
    //drawing code here 
    delete gc; 
} 
+0

我看了页面,但它不起作用。 – allenchen 2012-04-11 08:27:14

0

我觉得可疑太,建议页面无法正常工作。 现在我使用下面的代码,程序运行正常。

wxBufferedPaintDC pdc(this); 

wxGCDC gdc; 
wxGraphicsRenderer * const renderer = wxGraphicsRenderer::GetDefaultRenderer(); 
wxGraphicsContext * context = renderer->CreateContext(pdc); 
gdc.SetGraphicsContext(context); 

wxDC & dc = (wxDC &)gdc; 
PrepareDC(dc); 

Draw(dc); 

... 
0

您应该使用wxAutoBufferedPaintDC。 在某些平台(如GTK)上不需要缓冲。

然后,您可以使用构造

wxGCDC gcdc(dc); 

这个工程至少在GTK和垃圾。