Ejemplo n.º 1
0
 def OnPaint(self):
     if not self._win_paint_broken:
         try:
             win = self._win
             dc, ps = win.BeginPaint()
             try:
                 win_update_rect = ps[2]
                 if not empty_rect(win_update_rect):
                     #print "DrawableContainer.OnPaint: win_update_rect =", win_update_rect ###
                     scroll_offset = self._win_scroll_offset()
                     view_update_rect = offset_rect(win_update_rect, scroll_offset)
                     if self._double_buffer:
                         dx, dy = rect_topleft(view_update_rect)
                         width, height = rect_size(view_update_rect)
                         buffer = gdi.Bitmap(width, height)
                         canvas = Canvas._from_win_image(buffer)
                         canvas.translate(-dx, -dy)
                         self.draw(canvas, view_update_rect)
                         graphics = gdi.Graphics.from_dc(dc)
                         src_rect = (0, 0, width, height)
                         graphics.DrawImage_rr(buffer, win_update_rect, src_rect)
                     else:
                         self._win_prepare_dc(dc)
                         canvas = Canvas._from_win_dc(dc)
                         self.draw(canvas, view_update_rect)
             finally:
                 win.EndPaint(ps)
         except Exception:
             self._win_paint_broken = True
             raise
Ejemplo n.º 2
0
    def OnPaint(self):
        if not self._win_paint_broken:
            try:
                win = self._win
                dc, ps = win.BeginPaint()
                try:
                    win_update_rect = ps[2]
                    if not empty_rect(win_update_rect):
                        #print "DrawableContainer.OnPaint: win_update_rect =", win_update_rect ###
                        scroll_offset = self._win_scroll_offset()
                        view_update_rect = offset_rect(win_update_rect,
                                                       scroll_offset)
                        if self._double_buffer:
                            dx, dy = rect_topleft(view_update_rect)
                            width, height = rect_size(view_update_rect)
                            #GDIPlus draw large image in very bad performance
                            #use GDI instead
                            #buffer = gdi.Bitmap(width, height)
                            #canvas = Canvas._from_win_image(buffer)
                            #canvas.translate(-dx, -dy)
                            #self.draw(canvas, view_update_rect)
                            #graphics = gdi.Graphics.from_dc(dc)
                            #src_rect = (0, 0, width, height)
                            #graphics.DrawImage_rr(buffer, win_update_rect, src_rect)

                            c_dc = dc.CreateCompatibleDC(dc)
                            c_dm = ui.CreateBitmap()
                            c_dm.CreateCompatibleBitmap(dc, width, height)
                            old = c_dc.SelectObject(c_dm)
                            c_dc.SetViewportOrg((-dx, -dy))
                            canvas = Canvas._from_win_dc(c_dc)

                            self.draw(canvas, view_update_rect)

                            l, t = rect_topleft(win_update_rect)
                            dc.BitBlt((l, t), (width, height), c_dc, (0, 0),
                                      win32con.SRCCOPY)
                            c_dc.SelectObject(old)
                        else:
                            self._win_prepare_dc(dc)
                            canvas = Canvas._from_win_dc(dc)
                            self.draw(canvas, view_update_rect)
                finally:
                    win.EndPaint(ps)
            except Exception:
                self._win_paint_broken = True
                raise
Ejemplo n.º 3
0
    def invalidate_frame(self, rect):

        # Below is a logic to invalidate just the frame, not the whole rect.
        # This is to fight flicker. A better fix is to use double buffering.
        # If fixed, all of this could be just: self.invalidate_rect(rect)
        
        w, h = rect_size(rect)
        topleft = rect_topleft(rect)
        topright = add_pt(topleft, (w-1, 0))
        botleft = add_pt(topleft, (0, h-1))

        self.invalidate_rect(rect_sized(topleft, (1, h)))
        self.invalidate_rect(rect_sized(topleft, (w, 1)))
        self.invalidate_rect(rect_sized(topright, (1, h)))
        self.invalidate_rect(rect_sized(botleft, (w, 1)))