隱藏wx.lib.agw.customtreectrl.CustomTreeCtrl滾動條

版權所有,轉載請註明出處: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()
發佈了124 篇原創文章 · 獲贊 4 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章