#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- """ 画面にマウスで円を描画する。 スクロールバーでウインドウをスクロールできる版。 """ import wx draw_bitmap_brsuh = True bitmap_brush_image = "images/ball.png" class DrawPanel(wx.ScrolledWindow): def __init__(self, parent): wx.ScrolledWindow.__init__(self, parent, -1) self.maxWidth = 1024 self.maxHeight = 768 self.rate = wx.Point(8, 8) self.brushBitmap = None if draw_bitmap_brsuh: image = wx.Image(bitmap_brush_image) self.brushBitmap = image.ConvertToBitmap() self.SetVirtualSize((self.maxWidth, self.maxHeight)) self.SetScrollRate(self.rate.x, self.rate.y) # 空のビットマップを確保。以後はこれに描画していく self.buffer = wx.EmptyBitmap(self.maxWidth, self.maxHeight) self.buttonFlag = False self.DrawFirst() # 初期描画 # イベント割り当て self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftButtonEvent) self.Bind(wx.EVT_LEFT_UP, self.OnLeftButtonEvent) self.Bind(wx.EVT_MOTION, self.OnLeftButtonEvent) def OnPaint(self, event=None): dc = wx.BufferedPaintDC(self, self.buffer, wx.BUFFER_VIRTUAL_AREA) def OnLeftButtonEvent(self, event): if self.IsAutoScrolling(): self.StopAutoScrolling() pos = event.GetPosition() if event.LeftDown(): # マウスの左ボタンを押した self.DrawMiniCircle(pos.x, pos.y) self.buttonFlag = True elif event.Dragging() and self.buttonFlag: # マウスカーソルを動かした if self.buttonFlag: self.DrawMiniCircle(pos.x, pos.y) elif event.LeftUp() and self.buttonFlag: # マウスの左ボタンを離した self.buttonFlag = False def DrawMiniCircle(self, x, y): """ 指定座標に小さい円を描画 """ pdc = wx.BufferedDC(None, self.buffer) try: # アンチエイリアスをかける dc = wx.GCDC(pdc) except: dc = pdc # スクロールを考慮した座標値を取得 nx, ny = self.CalcUnscrolledPosition(x, y) if draw_bitmap_brsuh: # ビットマップ画像をブラシにして描画 nx -= self.brushBitmap.GetWidth() / 2 ny -= self.brushBitmap.GetHeight() / 2 dc.DrawBitmap(self.brushBitmap, nx, ny, True) else: # 円をブラシにして描画 dc.SetBrush(wx.Brush(wx.Colour(192, 192, 255))) dc.SetPen(wx.Pen("BLACK", 0)) dc.DrawCircle(nx, ny, 16) del dc self.Refresh(False) def DrawFirst(self): """ 初期描画 """ pdc = wx.BufferedDC(None, self.buffer) try: dc = wx.GCDC(pdc) except: dc = pdc dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.Clear() # 円を描画 dc.SetBrush(wx.Brush(wx.Colour(128, 128, 255))) dc.SetPen(wx.Pen("GREEN", 1)) dc.DrawCircle(100, 100, 100) dc.SetBrush(wx.Brush(wx.Colour(128, 255, 128))) dc.SetPen(wx.Pen("RED", 3)) dc.DrawCircle(self.maxWidth - 100, 100, 100) del dc class MyApp(wx.App): def OnInit(self): frame = wx.Frame(None, -1, "Draw Test 3", size=(640, 480)) DrawPanel(frame) frame.Show() self.SetTopWindow(frame) return True if __name__ == '__main__': app = MyApp() app.MainLoop()