2012-04-10 5 views
0

Um Flicker loszuwerden, verwende ich WxBufferedPaintDC anstelle von WxPaintDC. Aber da kommt ein Problem. Um in meiner Paint-Funktion eine kubische Beizer-Kurve zu zeichnen, muss ich GetGraphicsContext verwenden, um einen Pfad zu erstellen. Meine Frage ist, warum GetGraphicsContext einen NULL-Zeiger zurückgibt, wenn wxBufferedPaintDC verwendet wird.wxBufferedPaintDC GetGraphicsContext return Nullzeiger

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 */ 

    ... 
} 

Antwort

0

Die Besetzung, die Sie von wxBufferedPaintDC zu wxGCDC haben sieht ein wenig misstrauisch zu mir, die wxGraphicsContext Seiten schlägt es wie folgt tun:

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

Ich lese die Seite, aber es funktioniert nicht. – allenchen

0

Ich fühle mich zu verdächtig, wird der Vorschlag Seite nicht funktionieren . Jetzt benutze ich die folgenden Codes und das Programm läuft in Ordnung.

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

Sie sollten WxAutoBufferedPaintDC verwenden. Es gibt keine Notwendigkeit, auf einer Plattform (wie GTK) zu puffern.

Dann können Sie den Konstruktor

wxGCDC gcdc(dc); 

Das funktioniert zumindest auf GTK und MSW verwenden.