none
Visual Basic propiedad ghosted de los Items de un ListView RRS feed

  • Pregunta

  • Hola, estoy haciendo las funciones de copiar, cortar y pegar en Visual Basic 2012, ya lo tengo, pero me falta una pequeña cosa.

    Yo vengo del Visual Basic 6.0 y aquí existe una propiedad en los ListItems del ListView que se llama Ghosted, si está a True los iconos aparece atenuados, se usa en la acción de cortar para saber que los elementos seleccionados van a desaparecer después de pegar.

    ¿Como puedo reproducir este mismo efecto en Visual Basic 2012?


    lunes, 9 de junio de 2014 9:55

Respuestas

  • Puedes escribir un módulo con una extensión para el tipo ListViewItem. Esto te evita la necesidad de subclasearlo.

    Imports System.Runtime.CompilerServices
    Imports System.Runtime.InteropServices
    
    Module Module1
    
        <StructLayout(LayoutKind.Sequential)> _
        Public Structure LVITEM
            Public mask As Int32
            Public iItem As Int32
            Public iSubItem As Int32
            Public state As Int32
            Public stateMask As Int32
            Public pszText As String
            Public cchTextMax As Int32
            Public iImage As Int32
            Public lParam As IntPtr
        End Structure
    
        Public Const LVM_SETITEMSTATE = &H102B
        Public Const LVIF_STATE = &H8
        Public Const LVIS_CUT = &H4 'ghosted
    
        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Public Function SendMessage(ByVal listview As IntPtr, ByVal msg As UInteger, ByVal indice As Integer, ByRef item As LVITEM) As IntPtr
        End Function
    
        <Extension()>
        Public Sub Ghosted(ByVal lvItem As ListViewItem, Optional aplica As Boolean = True)
            Dim item As New LVITEM
    
            item.mask = LVIF_STATE
            item.stateMask = LVIS_CUT
            item.state = If(aplica, LVIS_CUT, 0)
    
            SendMessage(lvItem.ListView.Handle, LVM_SETITEMSTATE, lvItem.Index, item)
    
        End Sub
    
    End Module

    Y lo usas de esta manera.

    Public Class Form1
    
    	[...]
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            ListView1.Items(1).Ghosted(False)
            ListView1.Items(0).Ghosted()
        End Sub
    
    End Class

    Cuando pulsas el botón el primer item se ghostea y el segundo se desghostea.


    • Editado sopita lunes, 9 de junio de 2014 21:07
    • Marcado como respuesta José A. Arjona martes, 10 de junio de 2014 8:11
    • Desmarcado como respuesta José A. Arjona martes, 10 de junio de 2014 8:13
    • Marcado como respuesta José A. Arjona martes, 10 de junio de 2014 8:15
    lunes, 9 de junio de 2014 21:07
  • Muchas gracias, es justo lo que necesitaba.
    martes, 10 de junio de 2014 8:12

Todas las respuestas

  • Puedes escribir un módulo con una extensión para el tipo ListViewItem. Esto te evita la necesidad de subclasearlo.

    Imports System.Runtime.CompilerServices
    Imports System.Runtime.InteropServices
    
    Module Module1
    
        <StructLayout(LayoutKind.Sequential)> _
        Public Structure LVITEM
            Public mask As Int32
            Public iItem As Int32
            Public iSubItem As Int32
            Public state As Int32
            Public stateMask As Int32
            Public pszText As String
            Public cchTextMax As Int32
            Public iImage As Int32
            Public lParam As IntPtr
        End Structure
    
        Public Const LVM_SETITEMSTATE = &H102B
        Public Const LVIF_STATE = &H8
        Public Const LVIS_CUT = &H4 'ghosted
    
        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Public Function SendMessage(ByVal listview As IntPtr, ByVal msg As UInteger, ByVal indice As Integer, ByRef item As LVITEM) As IntPtr
        End Function
    
        <Extension()>
        Public Sub Ghosted(ByVal lvItem As ListViewItem, Optional aplica As Boolean = True)
            Dim item As New LVITEM
    
            item.mask = LVIF_STATE
            item.stateMask = LVIS_CUT
            item.state = If(aplica, LVIS_CUT, 0)
    
            SendMessage(lvItem.ListView.Handle, LVM_SETITEMSTATE, lvItem.Index, item)
    
        End Sub
    
    End Module

    Y lo usas de esta manera.

    Public Class Form1
    
    	[...]
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            ListView1.Items(1).Ghosted(False)
            ListView1.Items(0).Ghosted()
        End Sub
    
    End Class

    Cuando pulsas el botón el primer item se ghostea y el segundo se desghostea.


    • Editado sopita lunes, 9 de junio de 2014 21:07
    • Marcado como respuesta José A. Arjona martes, 10 de junio de 2014 8:11
    • Desmarcado como respuesta José A. Arjona martes, 10 de junio de 2014 8:13
    • Marcado como respuesta José A. Arjona martes, 10 de junio de 2014 8:15
    lunes, 9 de junio de 2014 21:07
  • Muchas gracias, es justo lo que necesitaba.
    martes, 10 de junio de 2014 8:12