版權所有,轉載請註明出處:http://guangboo.org/2013/02/06/wx-lib-agw-customtreectrl-customtreectrl-hide-scrollbar
wx.lib.agw.customtreectrl.CustomTreeCtrl雖然是由ScrolledWindow繼承而來,但是構造參數style卻不起作用,即使設置參數style = wx.VSCROLL即只顯示右邊滾動條,實際運行起來兩個滾動條依然會顯示。本土使用windows api來處理隱藏滾動條的問題。
wxPython缺陷
wxPython爲使用Python開發語言的開發者提供了一套跨平臺的GUI庫,它是wxWidgets的一個Python封裝,並且也有很多工具用於wxPython可視化的UI設計。然而在我使用它的這段時間,發現該GUI庫還存在一些缺陷,如控件都不支持透明背景,控件的背景色都是繼承父控件的背景色,並且Panel,window類等還沒有背景圖片的接口,這就給對UI設計要求較高的應用帶來了不便。雖然網絡上也有很多網友提供了很多解決方法,如重新繪製控件,使支持背景透明,使Panel支持背景圖片。
除了wxPython控件的一些功能欠缺外,還有些agw控件還存在一些問題,如本文要說的wx.lib.agw.customtreectrl.CustomTreeCtrl控件,無論怎麼設置構造函數的style值,都無法禁用滾動條。ScrolledWindow提供的EnableScrolling方法也沒有效果,因此,要想實現隱藏滾動條還必須另闢蹊徑。
Windows API--ShowScrollBar
好在windows提供了一些API可以才滾動條的屬性,其中ShowScrollBar函數可以實現滾動條的顯示與隱藏,因此可以使用該API來控制wxPython控件wx.lib.agw.customtreectrl.CustomTreeCtrl的滾動條的隱藏與顯示。
ShowScrollBar方法簽名:
BOOL ShowScrollBar( _In_ HWND hWnd, _In_ int wBar, _In_ BOOL bShow );
其中參數hWnd爲要控制滾動條控件的句柄,wBar爲滾動條選項,包括:SB_HORZ(0),表示標準橫向滾動條;SB_VERT(1),表示標準縱向滾動條;SB_CTL(2),表示滾動條控件;SB_BOTH(3),表示標準橫縱滾動條。bShow則表示顯示或隱藏,True爲顯示,False爲隱藏。
ShowScrollBar調用
在控件的構造函數中調用該api隱藏滾動條,經過測試是不行的,需要在EVT_PAINT事件中調用,並且必須要調用event.Skip()以調用其他已註冊的EVT_PAINT事件的處理方法。另外windows api ShowScrollBar在python中的定義,需要導入ctypes庫。部分代碼如下,首先是導入ctypes和常量定義:
import wx
import wx.lib.agw.customtreectrl as CT
import ctypes
SB_HORZ = 0
SB_VERT = 1
SB_CTL = 2
SB_BOTH = 3
接着是自定義控件:
class MyCustomTreeCtrl(CT.CustomTreeCtrl):
def __init__(self, parent, id = -1, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.VSCROLL):
CT.CustomTreeCtrl.__init__(self, parent, wx.ID_ANY, style = wx.VSCROLL,
agwStyle = wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.TR_NO_BUTTONS | wx.TR_EXTENDED | wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_HIDE_ROOT | wx.TR_NO_LINES)
self.EnableSelectionVista(True)
self.SetGradientStyle(1)
self.SetBackgroundColour(wx.WHITE)
self.SetBorderPen(wx.TRANSPARENT_PEN)
self.Bind(wx.EVT_PAINT, self._on_hide_scrollbar)
def _on_hide_scrollbar(self, event):
ctypes.windll.user32.ShowScrollBar(self.GetHandle(), SB_VERT, False)
event.Skip()