]>
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 self
.DrawSavedLines(dc
)
144 def DrawSavedLines(self
, dc
):
145 dc
.SetPen(wx
.Pen('MEDIUM FOREST GREEN', 4))
147 for line
in self
.lines
:
149 apply(dc
.DrawLine
, coords
)
152 def SetXY(self
, event
):
153 self
.x
, self
.y
= self
.ConvertEventCoords(event
)
155 def ConvertEventCoords(self
, event
):
156 xView
, yView
= self
.GetViewStart()
157 xDelta
, yDelta
= self
.GetScrollPixelsPerUnit()
158 return (event
.GetX() + (xView
* xDelta
),
159 event
.GetY() + (yView
* yDelta
))
161 def OnLeftButtonEvent(self
, event
):
169 elif event
.Dragging() and self
.drawing
:
171 # If doing buffered drawing, create the buffered DC, giving it
172 # it a real DC to blit to when done.
173 cdc
= wx
.ClientDC(self
)
175 dc
= wx
.BufferedDC(cdc
, self
.buffer)
177 dc
= wx
.ClientDC(self
)
181 dc
.SetPen(wx
.Pen('MEDIUM FOREST GREEN', 4))
182 coords
= (self
.x
, self
.y
) + self
.ConvertEventCoords(event
)
183 self
.curLine
.append(coords
)
189 elif event
.LeftUp() and self
.drawing
:
190 self
.lines
.append(self
.curLine
)
196 ## This is an example of what to do for the EVT_MOUSEWHEEL event,
197 ## but since wx.ScrolledWindow does this already it's not
198 ## necessary to do it ourselves. You would need to add an event table
199 ## entry to __init__() to direct wheelmouse events to this handler.
202 ## def OnWheel(self, evt):
203 ## delta = evt.GetWheelDelta()
204 ## rot = evt.GetWheelRotation()
205 ## linesPer = evt.GetLinesPerAction()
206 ## print delta, rot, linesPer
207 ## ws = self.wheelScroll
209 ## lines = ws / delta
210 ## ws = ws - lines * delta
211 ## self.wheelScroll = ws
213 ## lines = lines * linesPer
214 ## vsx, vsy = self.GetViewStart()
215 ## scrollTo = vsy - lines
216 ## self.Scroll(-1, scrollTo)
218 #---------------------------------------------------------------------------
220 def runTest(frame
, nb
, log
):
224 #---------------------------------------------------------------------------
231 The wx.ScrolledWindow class manages scrolling for its client area, transforming the
232 coordinates according to the scrollbar positions, and setting the scroll positions,
233 thumb sizes and ranges according to the area in view.
239 if __name__
== '__main__':
242 run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])