0

为了消除闪烁,我使用 wxBufferedPaintDC 代替 wxPaintDC。但是问题来了。在我的绘图函数中,为了绘制三次贝泽曲线,我必须使用 GetGraphicsContext 创建路径。我的问题是为什么 GetGraphicsContext 在使用 wxBufferedPaintDC 时返回一个 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 */

    ...
}
4

3 回答 3

0

你从wxBufferedPaintDCto的演员表wxGCDC对我来说有点可疑,wxGraphicsContext 页面建议这样做:

wxGraphicsContext *gc = wxGraphicsContext::Create( dc );
if (gc)
{
    //drawing code here
    delete gc;
}
于 2012-04-11T07:28:44.550 回答
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);

...
于 2012-04-11T08:26:12.650 回答
0

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

然后,您可以使用构造函数

wxGCDC gcdc(dc);

这至少适用于 GTK 和 MSW。

于 2013-09-05T20:24:23.897 回答