隐藏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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值