制作有背景图案的TreeView

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.MyTreeview1.BackgroundImage = Image.FromFile("d:/1.jpg")
            End Sub

   End Class

Public Class MyTreeview : Inherits treeview
    Dim myPicturebox As UPictureBox
    Dim myBitmap As Bitmap
    Dim myAlphaBitmap As Bitmap
    Dim myBackColor As Color = Color.Green
    Dim myBackAlpha As Integer = 0
    Dim myUpToDate As Boolean = False
    Dim myCaretUpToDate As Boolean = False
    Dim myPaintedFirstTime As Boolean = False
    Dim myCaretState As Boolean = True
    Dim myFontHeight As Integer = 10
    Dim myTimer1 As Timer


    Public Sub New()
        MyBase.New()
        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
        SetStyle(ControlStyles.UserPaint, True)
        SetStyle(ControlStyles.DoubleBuffer, True)
        Me.BackColor = Me.myBackColor
        Me.myPicturebox = New UPictureBox()
        Me.Controls.Add(Me.myPicturebox)
        Me.myPicturebox.Dock = DockStyle.Fill
        'Me.myPicturebox.Visible = False
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        MyBase.WndProc(m)
        If m.Msg = win32.WM_PAINT Then

            myPaintedFirstTime = True
            If Not (myUpToDate) Or Not (myCaretUpToDate) Then
                GetBitmap()
            End If
            myUpToDate = True
            myCaretUpToDate = True

            If (myPicturebox.Image IsNot Nothing) Then
                myPicturebox.Image.Dispose()
            End If
            myPicturebox.Image = myAlphaBitmap.Clone()
            'Me.BackgroundImage = myAlphaBitmap.Clone()
        End If
    End Sub

    Private Sub GetBitmap()
        If (myBitmap Is Nothing) OrElse (myAlphaBitmap Is Nothing) OrElse (myBitmap.Width <> Me.Width) OrElse (myBitmap.Height <> Me.Height) OrElse (myAlphaBitmap.Width <> Me.Width) OrElse (myAlphaBitmap.Height <> Height) Then
            myBitmap = Nothing
            myAlphaBitmap = Nothing
        End If


        If (myBitmap Is Nothing) Then
            myBitmap = New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)
            myUpToDate = False
        End If


        If Not (myUpToDate) Then
            'Capture the TextBox control window
            Me.SetStyle(ControlStyles.UserPaint, False)
            win32.CaptureWindow(Me, myBitmap)


            Me.SetStyle(ControlStyles.UserPaint, True)
            Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
            Me.BackColor = Color.FromArgb(myBackAlpha, myBackColor)
        End If

 

        Dim r2 As Rectangle = New Rectangle(0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height)
        Dim tempImageAttr As Imaging.ImageAttributes = New Imaging.ImageAttributes()
        'Found the color map code in the MS Help
        Dim tempColorMap(0) As Imaging.ColorMap
        tempColorMap(0) = New Imaging.ColorMap()
        tempColorMap(0).OldColor = Color.FromArgb(255, myBackColor)
        tempColorMap(0).NewColor = Color.FromArgb(myBackAlpha, myBackColor)
        tempImageAttr.SetRemapTable(tempColorMap)

        If (myAlphaBitmap IsNot Nothing) Then
            myAlphaBitmap.Dispose()
        End If


        myAlphaBitmap = New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)

        Dim tempGraphics1 As Graphics = Graphics.FromImage(myAlphaBitmap)

        tempGraphics1.DrawImage(myBitmap, r2, 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height, GraphicsUnit.Pixel, tempImageAttr)

        tempGraphics1.Dispose()

    End Sub

 

    Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
        MyBase.OnResize(e)
        Me.myBitmap = New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)
        Me.myAlphaBitmap = New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)
        myUpToDate = False
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
        MyBase.OnKeyDown(e)
        myUpToDate = False
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnKeyUp(ByVal e As System.Windows.Forms.KeyEventArgs)
        MyBase.OnKeyUp(e)
        myUpToDate = False
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
        MyBase.OnKeyPress(e)
        myUpToDate = False
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnMouseUp(ByVal mevent As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseUp(mevent)
        myUpToDate = False
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnGiveFeedback(ByVal gfbevent As System.Windows.Forms.GiveFeedbackEventArgs)
        MyBase.OnGiveFeedback(gfbevent)
        myUpToDate = False
        Me.Invalidate()
    End Sub
    Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
        MyBase.OnMouseLeave(e)
        Dim ptCursor As Point = Windows.Forms.Cursor.Position
        Dim f As Form = Me.FindForm
        ptCursor = f.PointToClient(ptCursor)
        If Not (Me.Bounds.Contains(ptCursor)) Then
            MyBase.OnMouseLeave(e)
        End If
    End Sub

    Protected Overrides Sub OnChangeUICues(ByVal e As System.Windows.Forms.UICuesEventArgs)
        MyBase.OnChangeUICues(e)
        myUpToDate = False
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
        MyBase.OnGotFocus(e)
        myUpToDate = False
        Me.Invalidate()
        myTimer1 = New Timer
        myTimer1.Interval = win32.GetCaretBlinkTime()
        AddHandler myTimer1.Tick, AddressOf mytick
        myTimer1.Enabled = True
    End Sub
    Private Sub mytick(ByVal send As Object, ByVal e As EventArgs)
        myCaretState = Not myCaretState
        myUpToDate = False
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
        MyBase.OnLostFocus(e)
        Me.myCaretUpToDate = False
        myUpToDate = False
        Me.Invalidate()

        myTimer1.Dispose()
    End Sub


    Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
        MyBase.OnTextChanged(e)

        myUpToDate = False
        Me.Invalidate()
    End Sub
End Class

Public Class UPictureBox : Inherits PictureBox
    Public Sub New()
        'MyBase.New()
        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        SetStyle(ControlStyles.UserPaint, True)
        SetStyle(ControlStyles.DoubleBuffer, True)
        Me.Cursor = Nothing
        Me.Enabled = True
        Me.SizeMode = PictureBoxSizeMode.Normal
    End Sub
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        If m.Msg = win32.WM_LBUTTONDOWN _
           Or m.Msg = win32.WM_RBUTTONDOWN _
           Or m.Msg = win32.WM_MOUSELEAVE _
           Or m.Msg = win32.WM_MOUSEMOVE Then
            win32.PostMessage(Me.Parent.Handle, m.Msg, m.WParam, m.LParam)
        ElseIf m.Msg = win32.WM_LBUTTONUP Then
            Me.Parent.Invalidate()
        End If
        MyBase.WndProc(m)
    End Sub
End Class


Public Class win32
    Public Const WM_MOUSEMOVE As Integer = &H200
    Public Const WM_LBUTTONDOWN As Integer = &H201
    Public Const WM_LBUTTONUP As Integer = &H202
    Public Const WM_RBUTTONDOWN As Integer = &H204
    Public Const WM_LBUTTONDBLCLK As Integer = &H203
    Public Const WM_MOUSELEAVE As Integer = &H2A3
    Public Const WM_PAINT As Integer = &HF
    Public Const WM_ERASEBKGND As Integer = &H14
    Public Const WM_PRINT As Integer = &H317
    Public Const WM_HSCROLL As Integer = &H114
    Public Const WM_VSCROLL As Integer = &H115
    Public Const EM_GETSEL As Integer = &HB0
    Public Const EM_LINEINDEX As Integer = &HBB
    Public Const EM_LINEFROMCHAR As Integer = &HC9
    Public Const EM_POSFROMCHAR As Integer = &HD6

    Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
      ByVal hwnd As Int32, _
      ByVal wMsg As Int32, _
      ByVal wParam As Int32, _
      ByVal lParam As Int32) As Int32
    Public Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
      ByVal hwnd As Int32, _
      ByVal wMsg As Int32, _
      ByVal wParam As Int32, _
      ByVal lParam As Int32) As Int32
    Public Declare Function GetCaretBlinkTime Lib "user32.dll" () As Int32

    Public Const WM_PRINTCLIENT As Integer = &H318
    Public Const PRF_CHECKVISIBLE = &H1L
    Public Const PRF_NONCLIENT = &H2L
    Public Const PRF_CLIENT = &H4L
    Public Const PRF_ERASEBKGND = &H8L
    Public Const PRF_CHILDREN = &H10L
    Public Const PRF_OWNED = &H20L


    Public Shared Function CaptureWindow(ByVal control As System.Windows.Forms.Control, ByRef bitmap As System.Drawing.Bitmap) As Boolean
        'This function captures the contents of a window or control
        Dim g2 As Graphics
        g2 = Graphics.FromImage(bitmap)
        Dim meint As Integer = CType((PRF_CLIENT + PRF_ERASEBKGND), Integer)
        Dim meptr As System.IntPtr = New System.IntPtr(meint)
        Dim hdc As System.IntPtr = g2.GetHdc()
        win32.SendMessage(control.Handle, win32.WM_PRINT, hdc, meptr)
        g2.ReleaseHdc(hdc)
        g2.Dispose()
        Return True
    End Function
End Class

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过设置treeview的style来改变其背景颜色。具体步骤如下: 1. 创建一个style对象: ``` style = ttk.Style() ``` 2. 设置treeview的style: ``` style.configure("Treeview", background="#fff") ``` 其中,"Treeview"是treeview的style名称,可以根据实际情况进行修改;background是背景颜色,可以根据需要进行修改。 3. 将style应用到treeview上: ``` treeview = ttk.Treeview(root, style="Treeview") ``` 其中,root是treeview所在的父窗口。 通过以上步骤,就可以改变treeview的背景颜色了。 ### 回答2: Tkinter Treeview控件是Python中用于创建层次结构的表格控件之一,经常被使用于图形用户界面程序中。Treeview控件可以用于展示数据的树状结构,而且非常常用。在Treeview控件中,我们可以为不同的行设置不同的背景颜色,来帮助用户更好地理解数据。 通常情况下,我们可以通过更改TreeView中的Tag颜色、样式和边框颜色等方式来设置树状表格的背景颜色。Tag标记是我们用于区分不同部分或行列的标识符。通过定义不同的Tag标记,我们能够分别设置它们的颜色和样式。 要设置Tkinter Treeview背景颜色,我们需要先为不同的行或列设置不同的Tag标签。我们可以使用treeview.tag_configure(‘tag_name’,background = ‘color’)方法来设置tag的颜色。其中,“tag_name”是我们为每个行或列定义的标记名称,“color”是我们要设置的颜色,该颜色可以是预定义颜色名称、RGB值或十六进制颜色值。 下面是一段实现Treeview背景颜色区分的代码示例: ```python import tkinter as tk from tkinter import ttk root = tk.Tk() root.title("Treeview Background Color Demo") # 创建Treeview treeview = ttk.Treeview(root) treeview.pack() # 定义标记tag1,tag2 treeview.tag_configure('tag1', background='green') treeview.tag_configure('tag2', background='red') # 添加行 treeview.insert('', '0', 'item1', text='First item', tags=('tag1',)) treeview.insert('item1', 'end', 'item2', text='Sub item 1',tags=('tag2',)) treeview.insert('item1', 'end', 'item3', text='Sub item 2',tags=('tag2',)) treeview.insert('', '1', 'item4', text='Second item',tags=('tag1',)) root.mainloop() ``` 在这个例子中,我们首先通过tag_configure方法定义了两个标记(tag1和tag2),并设置它们的颜色属性(background)分别为绿色和红色。然后,我们在TreeView中添加了四个行,其中第一个行有标记'tag1',而第二和第三个行有标记'tag2'。最后,我们通过执行root.mainloop()方法展示TreeView。 综上所述,通过使用tag_configure方法,我们可以很方便地为Tkinter Treeview设置不同背景颜色的标志,来增强数据的可读性和可视化效果,有助于用户更好地理解和识别Treeview中的数据。 ### 回答3: Tkintertreeview控件是一个非常方便实用的控件,可以让我们以树形的形式展示数据。treeview控件支持对每个单元格的字体、前景色和背景色进行设置。 修改treeview控件的单元格背景色,我们可以使用如下方式: 1. 首先,我们需要建立一个treeview对象,这个对象可以是ttk.Treeview或者tkinter.Treeview,建立方法类似于: ```python import tkinter as tk from tkinter import ttk root = tk.Tk() tree = ttk.Treeview(root) tree.pack() ``` 2. 我们可以使用item方法来指定单元格的背景颜色,对于每个单元格我们都需要指定一个ID。我们可以使用insert方法来往treeview中插入新的项目。 ```python # 在treeview根节点下插入第一行数据,指定ID为0 tree.insert("", 0, text="主节点", tags=("root",)) # 在第一行下插入两行数据,分别指定ID为1和2,背景为白色 tree.insert("", 1, text="叶子1", tags=("leaf",), background="white") tree.insert("", 2, text="叶子2", tags=("leaf",), background="white") ``` 这里,我们使用了tags来给treeview中的每个单元格打上标签,tags可以是任何我们愿意设置的字符集,用于后面的单元格样式设置。我们也可以在插入新行时指定单元格的颜色。 3. 如果我们需要更改已有行的颜色,我们可以直接使用item方法进行设置: ```python # 获取叶子1这一行的ID leaf_id = tree.get_children()[0] # 更改这一行的背景色为绿色 tree.item(leaf_id, background="green") ``` 这里我们通过调用get_children()方法来获取treeview中第一行的ID,也可指定关键字名获取行ID,然后使用item方法来设置ID所对应的行的单元格颜色。 以上就是关于如何在Tkintertreeview控件上设置单元格的背景颜色的方法。当然,更为复杂的样式设置,我们可以根据需要进行深入探究。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值