隐藏wx.lib.agw.customtreectrl.CustomTreeCtrl滚动条

来源:互联网 发布:迈卡威体测数据 编辑:程序博客网 时间:2024/05/29 08:36

版权所有,转载请注明出处: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 wximport wx.lib.agw.customtreectrl as CTimport ctypesSB_HORZ = 0SB_VERT = 1SB_CTL = 2SB_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()
原创粉丝点击