簡體   English   中英

如何在VB.NET中的listview上捕獲自動調整大小雙擊事件?

[英]How can I catch the autosize double-click event on a listview in VB.NET?

我正在使用Visual Studio 2008和VB.NET。 我的表單上有一個listview控件,我使用windows窗體設計器添加了列。 如您所知,如果雙擊sizer或divider或者要在兩列之間調用它的任何內容,左側的列將自動調整大小(除非您禁用它)。 我怎樣才能抓住這個具體事件? ColumnWidthChanged事件和DoubleClick事件可能是候選者,但在ColumnWidthChanged事件中,我無法確定它是否是自動調整大小。 同樣,沒有簡單的方法可以捕獲與DoubleClick事件完全相同的內容。 有沒有人有任何想法我怎么能抓住這個特定的事件類型?

檢測listview標題上的事件非常棘手。

您需要創建自己的標頭來替換它通常使用的標頭,然后收聽相應的消息。 據我所知,列調整大小句柄沒有任何特定的。

以下類是ListView的子類,並添加一個檢測列之間雙擊的處理程序。 我認為這就像它一樣接近。

我希望它能幫到你一些。

    Class MyListView
        Inherits ListView

        Protected Overrides Sub CreateHandle()
            MyBase.CreateHandle()
            New HeaderControl(Me)
        End Sub

        Private Class HeaderControl
            Inherits NativeWindow
            Private _parent As ListView = Nothing

            <DllImport("User32.dll", CharSet := CharSet.Auto, SetLastError := True)> _
            Public Shared Function SendMessage(hWnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr) As IntPtr
            End Function

            Public Sub New(parent As ListView)
                _parent = parent

                Dim header As IntPtr = SendMessage(parent.Handle, (&H1000 + 31), IntPtr.Zero, IntPtr.Zero)
                Me.AssignHandle(header)
            End Sub


            Protected Overrides Sub WndProc(ByRef message As Message)
                Const  WM_LBUTTONDBLCLK As Integer = &H203

                Select Case message.Msg
                    Case WM_LBUTTONDBLCLK
                        Dim position As Point = Control.MousePosition
                        Dim relative As Point = _parent.PointToClient(position)

                        Dim rightBorder As Integer = 0
                        For Each c As ColumnHeader In _parent.Columns
                            rightBorder += c.Width
                            If relative.X > (rightBorder - 6) AndAlso relative.X < (rightBorder + 6) Then
                                MessageBox.Show([String].Format("Double-click after column '{0}'", c.Text))
                            End If
                        Next
                        Exit Select
                End Select


                MyBase.WndProc(message)


            End Sub

        End Class
    End Class

您將需要包含一個使用System.Runtime.InteropServices; 聲明這項工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM