zoukankan      html  css  js  c++  java
  • 判断ListView双击了子项,并获取其位置与大小

    在VB中新建一个工程,放一个文本框与ListView,输入如下代码:
    Option Explicit

    Private Type POINTAPI
      X As Long
      Y As Long
    End Type

    Private Type RECT
      Left As Long
      Top As Long
      Right As Long
      Bottom As Long
    End Type

    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As KeyCodeConstants) As Integer

    Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Private Declare Function MapWindowPoints Lib "user32" (ByVal hwndFrom As Long, ByVal hwndTo As Long, lppt As Any, ByVal cPoints As Long) As Long

    Private 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 Const LVI_NOITEM = -1

    Private Const LVM_FIRST = &H1000
    Private Const LVM_GETSUBITEMRECT = (LVM_FIRST + 56)
    Private Const LVM_SUBITEMHITTEST = (LVM_FIRST + 57)

    Private Const LVIR_ICON = 1
    Private Const LVIR_LABEL = 2

    Private Type LVHITTESTINFO
      pt As POINTAPI
      flags As Long
      iItem As Long
      iSubItem As Long
    End Type

    Private Function ListView_GetSubItemRect(hWnd As Long, iItem As Long, iSubItem As Long, _
                                            code As Long, prc As RECT) As Boolean
      prc.Top = iSubItem
      prc.Left = code
      ListView_GetSubItemRect = SendMessage(hWnd, LVM_GETSUBITEMRECT, ByVal iItem, prc)
    End Function

    Private Function ListView_SubItemHitTest(hWnd As Long, plvhti As LVHITTESTINFO) As Long
      ListView_SubItemHitTest = SendMessage(hWnd, LVM_SUBITEMHITTEST, 0, plvhti)
    End Function

    Private Sub Form_Load()
    Dim i As Long
    Dim item As ListItem
      '数据准备
      With ListView1
        .HideSelection = False
        .View = lvwReport
        For i = 1 To 4
          .ColumnHeaders.Add Text:="column" & i
        Next
       
        For i = 0 To &H3F
          Set item = .ListItems.Add(, , "item" & i)
          item.SubItems(1) = i * 10
          item.SubItems(2) = i * 100
          item.SubItems(3) = i * 1000
        Next
      End With
      Text1.ZOrder 0
    End Sub

    Private Sub ListView1_DblClick()
    Dim lvhti As LVHITTESTINFO
    Dim rc As RECT
      '检测是否是鼠标左键
      If (GetKeyState(vbKeyLButton) And &H8000) Then
        '获取鼠标当前位置
        GetCursorPos lvhti.pt
        '转换到ListView中的位置
        ScreenToClient ListView1.hWnd, lvhti.pt
       
        If (ListView_SubItemHitTest(ListView1.hWnd, lvhti) <> LVI_NOITEM) Then
          '点击项目
          If lvhti.iSubItem Then
            '是子项
            If ListView_GetSubItemRect(ListView1.hWnd, lvhti.iItem, lvhti.iSubItem, LVIR_LABEL, rc) Then
              ' 也可以把文件框设到ListView中
    '          SetParent Text1.hWnd, ListView1.hWnd
              MapWindowPoints ListView1.hWnd, hWnd, rc, 2
              Text1.Move (rc.Left + 4) * Screen.TwipsPerPixelX, _
                         rc.Top * Screen.TwipsPerPixelY, _
                         (rc.Right - rc.Left) * Screen.TwipsPerPixelX, _
                         (rc.Bottom - rc.Top) * Screen.TwipsPerPixelY
             
            End If
          End If
        End If
      End If
    End Sub

  • 相关阅读:
    索尼MT27i Android2.3.7 线刷Android4.04
    如何在三分钟内要到陌生女孩的电话
    闲情逸致小说嫉妒
    LINQ查询返回DataTable类型
    30个Oracle语句优化规则详解(1)
    .net session超时设置 sessionState的相关属性
    Socket请求和Http请求的各自特点、区别及适用场景
    在Oracle触发器中调用webService 或者java程序
    vs2010中使用log4net的方法
    Oracle 记录操作时长
  • 原文地址:https://www.cnblogs.com/yzx99/p/1453404.html
Copyright © 2011-2022 走看看