import wx import wx.combo #---------------------------------------------------------------------- # This ComboBox class graphically displays the various pen styles that # are available, making it easy for the user to choose the style they # want. class PenStyleComboBox(wx.combo.OwnerDrawnComboBox): # Overridden from OwnerDrawnComboBox, called to draw each # item in the list def OnDrawItem(self, dc, rect, item, flags): if item == wx.NOT_FOUND: # painting the control, but there is no valid item selected yet return r = wx.Rect(*rect) # make a copy r.Deflate(3, 5) penStyle = wx.SOLID if item == 1: penStyle = wx.TRANSPARENT elif item == 2: penStyle = wx.DOT elif item == 3: penStyle = wx.LONG_DASH elif item == 4: penStyle = wx.SHORT_DASH elif item == 5: penStyle = wx.DOT_DASH elif item == 6: penStyle = wx.BDIAGONAL_HATCH elif item == 7: penStyle = wx.CROSSDIAG_HATCH elif item == 8: penStyle = wx.FDIAGONAL_HATCH elif item == 9: penStyle = wx.CROSS_HATCH elif item == 10: penStyle = wx.HORIZONTAL_HATCH elif item == 11: penStyle = wx.VERTICAL_HATCH pen = wx.Pen(dc.GetTextForeground(), 3, penStyle) dc.SetPen(pen) if flags & wx.combo.ODCB_PAINTING_CONTROL: # for painting the control itself dc.DrawLine( r.x+5, r.y+r.height/2, r.x+r.width - 5, r.y+r.height/2 ) else: # for painting the items in the popup dc.DrawText(self.GetString( item ), r.x + 3, (r.y + 0) + ( (r.height/2) - dc.GetCharHeight() )/2 ) dc.DrawLine( r.x+5, r.y+((r.height/4)*3)+1, r.x+r.width - 5, r.y+((r.height/4)*3)+1 ) # Overridden from OwnerDrawnComboBox, called for drawing the # background area of each item. def OnDrawBackground(self, dc, rect, item, flags): # If the item is selected, or its item # iseven, or we are painting the # combo control itself, then use the default rendering. if (item & 1 == 0 or flags & (wx.combo.ODCB_PAINTING_CONTROL | wx.combo.ODCB_PAINTING_SELECTED)): wx.combo.OwnerDrawnComboBox.OnDrawBackground(self, dc, rect, item, flags) return # Otherwise, draw every other background with different colour. bgCol = wx.Colour(240,240,250) dc.SetBrush(wx.Brush(bgCol)) dc.SetPen(wx.Pen(bgCol)) dc.DrawRectangleRect(rect); # Overridden from OwnerDrawnComboBox, should return the height # needed to display an item in the popup, or -1 for default def OnMeasureItem(self, item): # Simply demonstrate the ability to have variable-height items if item & 1: return 36 else: return 24 # Overridden from OwnerDrawnComboBox. Callback for item width, or # -1 for default/undetermined def OnMeasureItemWidth(self, item): return -1; # default - will be measured from text width #---------------------------------------------------------------------- class TestPanel(wx.Panel): def __init__(self, parent, log): self.log = log wx.Panel.__init__(self, parent, -1) penStyles = [ "Solid", "Transparent", "Dot", "Long Dash", "Short Dash", "Dot Dash", "Backward Diagonal Hatch", "Cross-diagonal Hatch", "Forward Diagonal Hatch", "Cross Hatch", "Horizontal Hatch", "Vertical Hatch", ] wx.StaticText(self, -1, "Pen Styles:", (20, 20)) pscb = PenStyleComboBox(self, choices=penStyles, style=wx.CB_READONLY, pos=(20,40), size=(250, -1)) self.pscb = pscb #---------------------------------------------------------------------- def runTest(frame, nb, log): win = TestPanel(nb, log) return win #---------------------------------------------------------------------- overview = """

wx.combo.OwnerDrawnComboBox

wx.combo.OwnerDrawnComboBox is a combobox with owner-drawn list items. In essence, it is a wx.combo.ComboCtrl with wx.VListBox popup and wx.ControlWithItems interface. """ if __name__ == '__main__': import sys,os import run run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])