]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/ScrolledWindow.py
   7 #--------------------------------------------------------------------------- 
   9 class MyCanvas(wx
.ScrolledWindow
): 
  10     def __init__(self
, parent
, id = -1, size 
= wx
.DefaultSize
): 
  11         wx
.ScrolledWindow
.__init
__(self
, parent
, id, (0, 0), size
=size
, style
=wx
.SUNKEN_BORDER
) 
  20         self
.SetBackgroundColour("WHITE") 
  21         self
.SetCursor(wx
.StockCursor(wx
.CURSOR_PENCIL
)) 
  22         bmp 
= images
.getTest2Bitmap() 
  23         mask 
= wx
.Mask(bmp
, wx
.BLUE
) 
  27         self
.SetVirtualSize((self
.maxWidth
, self
.maxHeight
)) 
  28         self
.SetScrollRate(20,20) 
  31             # Initialize the buffer bitmap.  No real DC is needed at this point. 
  32             self
.buffer = wx
.EmptyBitmap(self
.maxWidth
, self
.maxHeight
) 
  33             dc 
= wx
.BufferedDC(None, self
.buffer) 
  34             dc
.SetBackground(wx
.Brush(self
.GetBackgroundColour())) 
  38         self
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnLeftButtonEvent
) 
  39         self
.Bind(wx
.EVT_LEFT_UP
,   self
.OnLeftButtonEvent
) 
  40         self
.Bind(wx
.EVT_MOTION
,    self
.OnLeftButtonEvent
) 
  41         self
.Bind(wx
.EVT_PAINT
, self
.OnPaint
) 
  51     def OnPaint(self
, event
): 
  53             # Create a buffered paint DC.  It will create the real 
  54             # wx.PaintDC and then blit the bitmap to it when dc is 
  55             # deleted.  Since we don't need to draw anything else 
  56             # here that's all there is to it. 
  57             dc 
= wx
.BufferedPaintDC(self
, self
.buffer, wx
.BUFFER_VIRTUAL_AREA
) 
  61             # since we're not buffering in this case, we have to 
  62             # paint the whole window, potentially very time consuming. 
  66     def DoDrawing(self
, dc
, printing
=False): 
  68         dc
.SetPen(wx
.Pen('RED')) 
  69         dc
.DrawRectangle(5, 5, 50, 50) 
  71         dc
.SetBrush(wx
.LIGHT_GREY_BRUSH
) 
  72         dc
.SetPen(wx
.Pen('BLUE', 4)) 
  73         dc
.DrawRectangle(15, 15, 50, 50) 
  75         dc
.SetFont(wx
.Font(14, wx
.SWISS
, wx
.NORMAL
, wx
.NORMAL
)) 
  76         dc
.SetTextForeground(wx
.Colour(0xFF, 0x20, 0xFF)) 
  77         te 
= dc
.GetTextExtent("Hello World") 
  78         dc
.DrawText("Hello World", 60, 65) 
  80         dc
.SetPen(wx
.Pen('VIOLET', 4)) 
  81         dc
.DrawLine(5, 65+te
[1], 60+te
[0], 65+te
[1]) 
  83         lst 
= [(100,110), (150,110), (150,160), (100,160)] 
  84         dc
.DrawLines(lst
, -60) 
  85         dc
.SetPen(wx
.GREY_PEN
) 
  86         dc
.DrawPolygon(lst
, 75) 
  87         dc
.SetPen(wx
.GREEN_PEN
) 
  88         dc
.DrawSpline(lst
+[(100,100)]) 
  90         dc
.DrawBitmap(self
.bmp
, 200, 20, True) 
  91         dc
.SetTextForeground(wx
.Colour(0, 0xFF, 0x80)) 
  92         dc
.DrawText("a bitmap", 200, 85) 
  94 ##         dc.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.NORMAL)) 
  95 ##         dc.SetTextForeground("BLACK") 
  96 ##         dc.DrawText("TEST this STRING", 10, 200) 
  97 ##         print dc.GetFullTextExtent("TEST this STRING") 
  99         font 
= wx
.Font(20, wx
.SWISS
, wx
.NORMAL
, wx
.NORMAL
) 
 101         dc
.SetTextForeground(wx
.BLACK
) 
 103         for a 
in range(0, 360, 45): 
 104             dc
.DrawRotatedText("Rotated text...", 300, 300, a
) 
 106         dc
.SetPen(wx
.TRANSPARENT_PEN
) 
 107         dc
.SetBrush(wx
.BLUE_BRUSH
) 
 108         dc
.DrawRectangle(50,500, 50,50) 
 109         dc
.DrawRectangle(100,500, 50,50) 
 111         dc
.SetPen(wx
.Pen('RED')) 
 112         dc
.DrawEllipticArc(200,500, 50,75, 0, 90) 
 115             # This has troubles when used on a print preview in wxGTK, 
 116             # probably something to do with the pen styles and the scaling 
 120             for style 
in [wx
.DOT
, wx
.LONG_DASH
, wx
.SHORT_DASH
, wx
.DOT_DASH
, wx
.USER_DASH
]: 
 121                 pen 
= wx
.Pen("DARK ORCHID", 1, style
) 
 122                 if style 
== wx
.USER_DASH
: 
 123                     pen
.SetCap(wx
.CAP_BUTT
) 
 127                 dc
.DrawLine(300,y
, 400,y
) 
 130         dc
.SetBrush(wx
.TRANSPARENT_BRUSH
) 
 131         dc
.SetPen(wx
.Pen(wx
.Colour(0xFF, 0x20, 0xFF), 1, wx
.SOLID
)) 
 132         dc
.DrawRectangle(450,50,  100,100) 
 133         old_pen 
= dc
.GetPen() 
 134         new_pen 
= wx
.Pen("BLACK", 5) 
 136         dc
.DrawRectangle(470,70,  60,60) 
 138         dc
.DrawRectangle(490,90, 20,20) 
 140         dc
.GradientFillLinear((20, 260, 50, 50), 
 142         dc
.GradientFillConcentric((20, 325, 50, 50), 
 143                                   "red", "blue", (25,25)) 
 144         self
.DrawSavedLines(dc
) 
 148     def DrawSavedLines(self
, dc
): 
 149         dc
.SetPen(wx
.Pen('MEDIUM FOREST GREEN', 4)) 
 151         for line 
in self
.lines
: 
 153                 apply(dc
.DrawLine
, coords
) 
 156     def SetXY(self
, event
): 
 157         self
.x
, self
.y 
= self
.ConvertEventCoords(event
) 
 159     def ConvertEventCoords(self
, event
): 
 160         newpos 
= self
.CalcUnscrolledPosition(event
.GetX(), event
.GetY()) 
 163     def OnLeftButtonEvent(self
, event
): 
 171         elif event
.Dragging() and self
.drawing
: 
 173                 # If doing buffered drawing we'll just update the 
 174                 # buffer here and then refresh that portion of the 
 175                 # window, then that portion of the buffer will be 
 176                 # redrawn in the EVT_PAINT handler. 
 177                 dc 
= wx
.BufferedDC(None, self
.buffer) 
 179                 # otherwise we'll draw directly to a wx.ClientDC 
 180                 dc 
= wx
.ClientDC(self
) 
 183             dc
.SetPen(wx
.Pen('MEDIUM FOREST GREEN', 4)) 
 184             coords 
= (self
.x
, self
.y
) + self
.ConvertEventCoords(event
) 
 185             self
.curLine
.append(coords
) 
 190                 # figure out what part of the window to refresh 
 191                 x1
,y1
, x2
,y2 
= dc
.GetBoundingBox() 
 192                 x1
,y1 
= self
.CalcScrolledPosition(x1
, y1
) 
 193                 x2
,y2 
= self
.CalcScrolledPosition(x2
, y2
) 
 196                 rect
.SetTopLeft((x1
,y1
)) 
 197                 rect
.SetBottomRight((x2
,y2
)) 
 200                 self
.RefreshRect(rect
) 
 202         elif event
.LeftUp() and self
.drawing
: 
 203             self
.lines
.append(self
.curLine
) 
 209 ## This is an example of what to do for the EVT_MOUSEWHEEL event, 
 210 ## but since wx.ScrolledWindow does this already it's not 
 211 ## necessary to do it ourselves. You would need to add an event table  
 212 ## entry to __init__() to direct wheelmouse events to this handler. 
 215 ##     def OnWheel(self, evt): 
 216 ##         delta = evt.GetWheelDelta() 
 217 ##         rot = evt.GetWheelRotation() 
 218 ##         linesPer = evt.GetLinesPerAction() 
 219 ##         print delta, rot, linesPer 
 220 ##         ws = self.wheelScroll 
 222 ##         lines = ws / delta 
 223 ##         ws = ws - lines * delta 
 224 ##         self.wheelScroll = ws 
 226 ##             lines = lines * linesPer 
 227 ##             vsx, vsy = self.GetViewStart() 
 228 ##             scrollTo = vsy - lines 
 229 ##             self.Scroll(-1, scrollTo) 
 231 #--------------------------------------------------------------------------- 
 233 def runTest(frame
, nb
, log
): 
 237 #--------------------------------------------------------------------------- 
 244 The wx.ScrolledWindow class manages scrolling for its client area, transforming the  
 245 coordinates according to the scrollbar positions, and setting the scroll positions,  
 246 thumb sizes and ranges according to the area in view. 
 252 if __name__ 
== '__main__': 
 255     run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])