69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
#--------------------------------------------------------------------
|
|
#
|
|
# PyGUI - DrawableContainer - Win32
|
|
#
|
|
#--------------------------------------------------------------------
|
|
|
|
from GUI import export
|
|
from GUI import Canvas
|
|
from GUI.Geometry import rect_topleft, rect_size, offset_rect, empty_rect
|
|
from GUI.GDrawableContainers import DrawableContainer as GDrawableContainer
|
|
import GUI.GDIPlus as gdi
|
|
|
|
class DrawableContainer(GDrawableContainer):
|
|
|
|
_double_buffer = True
|
|
_win_paint_broken = False
|
|
|
|
def update(self):
|
|
self._win.UpdateWindow()
|
|
|
|
def with_canvas(self, body):
|
|
win = self._win
|
|
dc = win.GetDC()
|
|
self._win_prepare_dc(dc)
|
|
try:
|
|
canvas = Canvas._from_win_dc(dc)
|
|
body(canvas)
|
|
finally:
|
|
win.ReleaseDC(dc)
|
|
|
|
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
|
|
|
|
def _win_prepare_dc(self, dc):
|
|
dc.SetWindowOrg(self._win_scroll_offset())
|
|
|
|
def _win_scroll_offset(self):
|
|
return (0, 0)
|
|
|
|
export(DrawableContainer)
|