就像资源管理器用"详细信息"显示内容时出现在标头上,用于显示当前排序状态的小三角形?

解决方案 »

  1.   

    可以设置当前点中的列的固定列text=固定列text + "  小三角"
      

  2.   

    http://btmtz.mvps.org/vbexplorer/vbexplorer.zip
    这里面有详尽的写法,具体在cLVHeaderSortIcons.cls的SetHeaderIcons函数中,楼主可参考一下
      

  3.   

    应该不难吧。
    根据指定列排序状况,修改Text
    Private Sub Form_Load()
    ListView1.View = lvwReport
    ListView1.AllowColumnReorder = True
    ListView1.ColumnHeaders.Add , , "第1列(↑)"
    End Sub
    Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    If ColumnHeader.Text Like "*↑*" Then
       ColumnHeader.Text = VBA.Replace(ColumnHeader.Text, "↑", "↓")
    Else
       ColumnHeader.Text = VBA.Replace(ColumnHeader.Text, "↓", "↑")
    End If
    End Sub
      

  4.   

    另外也可以使用ColumnHeaderIcons 属性:ColumnHeaderIcons 属性
          返回或者设置 Imagelist 控件,该控件为 ColumnHeaders 集合提供图标。语法object.ColumnHeaderIcons [= imagelist]ColumnHeaderIcons 的语法包括下列部分:部分 描述 
    object 一个对象表达式,其值等于“应用于”列表中的一个对象。 
    imagelist 一个 ImageList 控件,或者指向 Imagelist 控件的一个对象引用。 
    说明要为 ColumnHeader 对象设置图标,请将它的 Icon 属性设置成为一个索引值、关键字或者对象引用,以指向 ColumnHeaderIcons 属性指定的 ImageList 控件中的一个 ListImage 对象。
      

  5.   

    小三角形是一个ICO的图片Private Const LVM_FIRST = &H1000
    Private Const LVM_GETHEADER = (LVM_FIRST + 31)Private Const HDI_BITMAP = &H10
    Private Const HDI_IMAGE = &H20
    Private Const HDI_FORMAT = &H4
    Private Const HDI_TEXT = &H2Private Const HDF_BITMAP_ON_RIGHT = &H1000
    Private Const HDF_BITMAP = &H2000
    Private Const HDF_IMAGE = &H800
    Private Const HDF_STRING = &H4000Private Const HDM_FIRST = &H1200
    Private Const HDM_SETITEM = (HDM_FIRST + 4)
    Private Const HDM_SETIMAGELIST = (HDM_FIRST + 8)
    Private Const HDM_GETIMAGELIST = (HDM_FIRST + 9)Private Type HD_ITEM
       mask As Long
       cxy As Long
       pszText As String
       hbm As Long
       cchTextMax As Long
       fmt As Long
       lParam As Long
       iImage As Long
       iOrder As Long
    End TypePrivate Declare Function SendMessage Lib "user32" _
       Alias "SendMessageA" _
      (ByVal hwnd As Long, _
       ByVal wMsg As Long, _
       ByVal wParam As Long, _
       lParam As Any) As Long
    Private Sub Form_Load()   Dim i As Integer
       Dim itmX As ListItem
       
      'Create and populate the listview
       With ListView1
          
          .SmallIcons = ImageList1
          
          For i = 1 To 3
             .ColumnHeaders.Add , "x" & i, "Column " & i 
             .ColumnHeaders.Item(i).Width = 1520
          Next i
          
          For i = 1 To 9
             Set itmX = .ListItems.Add(, "key" & i, "Item " & i)
             itmX.SubItems(1) = "Subitem " & i
             itmX.SubItems(2) = "Subitem " & i
          Next i
          
       End With
       
      'ShowHeaderIcon colNo, imgIndex, showFlag
       ShowHeaderIcon 0, 0, True
       
    End Sub
    Private Sub Command1_Click()   Unload Me
          
    End Sub
    Public Sub ShowHeaderIcon(colNo As Long, _
                              imgIconNo As Long, _
                              showImage As Long)   Dim hHeader As Long
       Dim HD As HD_ITEM
       
      'get a handle to the listview header component
       hHeader = SendMessage(ListView1.hwnd, LVM_GETHEADER, 0, ByVal 0)
       
      'set up the required structure members
       With HD
          .mask = HDI_IMAGE Or HDI_FORMAT
          .pszText = ListView1.ColumnHeaders(colNo + 1).Text
          
           If showImage Then
             .fmt = HDF_STRING Or HDF_IMAGE Or HDF_BITMAP_ON_RIGHT
             .iImage = imgIconNo
           Else
             .fmt = HDF_STRING
          End If
       End With
       
      'modify the header
       Call SendMessage(hHeader, HDM_SETITEM, colNo, HD)
       
    End Sub
    Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ComctlLib.ColumnHeader)   Dim i As Long
       Static sOrder
       
       sOrder = Not sOrder
       
      'Use default sorting to sort the items in the list
       ListView1.SortKey = ColumnHeader.Index - 1
       ListView1.SortOrder = Abs(sOrder)
       ListView1.Sorted = True
       
      'clear the image from the headers not
      'currently selected, and update the
      'header clicked
       For i = 0 To 2
          
         'if this is the index of the header clicked
          If i = ListView1.SortKey Then
          
            'ShowHeaderIcon colNo, imgIndex, showFlag
             ShowHeaderIcon ListView1.SortKey, _
                            ListView1.SortOrder, _
                            True
                               
          Else
             ShowHeaderIcon i, 0, False
          End If
       
       Next
       
    End Sub
      

  6.   

    原来要用API,为了节约时间,用了个汉字的▲▼代替了。
      

  7.   

    排序用这代码最简单了
    Private Sub LVTest_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)    LVTest.Sorted = True
        LVTest.SortKey = ColumnHeader.Index - 1
        Dim i As Integer
        For i = 1 To LVTest.ColumnHeaders.Count
            If InStr(1, LVTest.ColumnHeaders(i).Text, "▲", vbTextCompare) <> 0 Then LVTest.ColumnHeaders(i).Text = Left(LVTest.ColumnHeaders(i).Text, Len(LVTest.ColumnHeaders(i).Text) - 3)        If InStr(1, LVTest.ColumnHeaders(i).Text, "▼", vbTextCompare) <> 0 Then LVTest.ColumnHeaders(i).Text = Left(LVTest.ColumnHeaders(i).Text, Len(LVTest.ColumnHeaders(i).Text) - 3)    Next i
        If LVTest.SortOrder = lvwAscending Then
            ColumnHeader.Text = ColumnHeader.Text & "  ▼"
            LVTest.SortOrder = lvwDescending
        Else
            ColumnHeader.Text = ColumnHeader.Text & "  ▲"
            LVTest.SortOrder = lvwAscending
        End If
        
    End Sub