GraphicsPath 并不总是自行刷新

发布于 2024-08-22 19:51:28 字数 1526 浏览 6 评论 0原文

此应用程序中的简单曲线仅在将其拖出屏幕或调整窗口大小时才会出现。当应用程序刚启动时它不会出现,当窗口最大化或最小化时它也会消失。然而,所有这些时间,都会打印“Path Drawn”,因此所有绘画函数都会被调用。在创建和绘制图形上下文方面我做错了什么吗?如果没有,在这些特殊情况下如何使窗口完全刷新?

import wx

class Path(object):
    def paint(self,gc):
        print "Path Drawn"
        gc.SetPen(wx.Pen("#000000",1))
        path=gc.CreatePath()
        path.MoveToPoint(wx.Point2D(10,10))
        path.AddCurveToPoint(wx.Point2D(10,50),
                             wx.Point2D(10,150),
                             wx.Point2D(100,100))
        gc.DrawPath(path)


class TestPane(wx.Panel):
    def __init__(self,parent=None,id=-1):
        wx.Panel.__init__(self,parent,id,style=wx.TAB_TRAVERSAL)
        self.SetBackgroundColour("#FFFFFF")
        self.Bind(wx.EVT_PAINT,self.onPaint)
        self.SetDoubleBuffered(True)
        self.path=Path()

    def onPaint(self, event):
        event.Skip()

        dc=wx.PaintDC(self)
        dc.BeginDrawing()
        gc = wx.GraphicsContext.Create(dc)

        gc.PushState()
        self.path.paint(gc)
        gc.PopState()
        dc.EndDrawing()

    def drawTestRects(self,dc):
        dc.SetBrush(wx.Brush("#000000",style=wx.SOLID))
        dc.DrawRectangle(50,50,50,50)
        dc.DrawRectangle(100,100,100,100)

class TestFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(640,480))
        self.mainPanel=TestPane(self,-1)

        self.Show(True)


app = wx.App(False)
frame = TestFrame(None,"Test App")
app.MainLoop()

The simple curve in this application only appears when it's dragged off the screen, or the window is resized. When the application just starts up it doesn't appear, and when the window is maximized or minimized it also disappears. However, all of these times, "Path Drawn" is printed, so all of the painting functions are called. Is there something I'm doing wrong with regards to creating and drawing on the graphicscontext? If not, how can I make the window totally refresh in these special cases?

import wx

class Path(object):
    def paint(self,gc):
        print "Path Drawn"
        gc.SetPen(wx.Pen("#000000",1))
        path=gc.CreatePath()
        path.MoveToPoint(wx.Point2D(10,10))
        path.AddCurveToPoint(wx.Point2D(10,50),
                             wx.Point2D(10,150),
                             wx.Point2D(100,100))
        gc.DrawPath(path)


class TestPane(wx.Panel):
    def __init__(self,parent=None,id=-1):
        wx.Panel.__init__(self,parent,id,style=wx.TAB_TRAVERSAL)
        self.SetBackgroundColour("#FFFFFF")
        self.Bind(wx.EVT_PAINT,self.onPaint)
        self.SetDoubleBuffered(True)
        self.path=Path()

    def onPaint(self, event):
        event.Skip()

        dc=wx.PaintDC(self)
        dc.BeginDrawing()
        gc = wx.GraphicsContext.Create(dc)

        gc.PushState()
        self.path.paint(gc)
        gc.PopState()
        dc.EndDrawing()

    def drawTestRects(self,dc):
        dc.SetBrush(wx.Brush("#000000",style=wx.SOLID))
        dc.DrawRectangle(50,50,50,50)
        dc.DrawRectangle(100,100,100,100)

class TestFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(640,480))
        self.mainPanel=TestPane(self,-1)

        self.Show(True)


app = wx.App(False)
frame = TestFrame(None,"Test App")
app.MainLoop()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

妥活 2024-08-29 19:51:28

注释掉 self.SetDoubleBuffered(True) 部分,它将起作用,因为由于错误 http://trac.wxwidgets.org/ticket/11138 窗口无法正确刷新。

如果您必须需要双缓冲,请自行实现,例如首先绘制到 MeomryDC,然后使用 blit 或绘制位图来绘制 dc。

Comment out the self.SetDoubleBuffered(True) part and it will work, because due to bug http://trac.wxwidgets.org/ticket/11138 window isn't refreshed correctly if SetDoubleBuffered and GraphicsContext are used together.

If you MUST need double buffering implement it yourselves e.g. first draw to a MeomryDC and then blit or paint bitmap to paint dc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文