文件一,Form1.frm
加入一个Listview,两个Imagelist,一个文本框
代码如下:
Option Explicit
'
' Copyright ?1997-1999 Brad Martinez, http://www.mvps.org
'
' Demonstrates how to in place do SubItem editing in the VB ListView.
Private m_hwndLV As Long ' ListView1.hWnd
Private m_hwndTB As Long ' TextBox1.hWnd
Private m_iItem As Long ' ListItem.Index whose SubItem is being edited
Private m_iSubItem As Long ' zero based index of ListView1.ListItems(m_iItem).SubItem being edited
'
Private Sub Form_Load()
Dim i As Long
Dim item As ListItem
' Text1.Appearance = ccFlat ' ComctlLib enum value
Text1.Visible = False
m_hwndTB = Text1.hWnd
' Initialize the ImageLists
With ImageList1
.ImageHeight = 32
.ImageWidth = 32
.ListImages.Add Picture:=Icon
End With
With ImageList2
.ImageHeight = 16
.ImageWidth = 16
.ListImages.Add Picture:=Icon
End With
' Initialize the ListView
With ListView1
' .LabelEdit = lvwManual
.HideSelection = False
.Icons = ImageList1
.SmallIcons = ImageList2
m_hwndLV = .hWnd
For i = 1 To 4
.ColumnHeaders.Add Text:="column" & i
Next
For i = 0 To &H3F
Set item = .ListItems.Add(, , "item" & i, 1, 1)
item.SubItems(1) = i * 10
item.SubItems(2) = i * 100
item.SubItems(3) = i * 1000
Next
End With
End Sub
Private Sub Form_Resize()
' ListView1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub
Private Sub ListView1_DblClick()
Dim lvhti As LVHITTESTINFO
Dim rc As RECT
Dim li As ListItem
' If a left button double-click... (change to suit)
If (GetKeyState(vbKeyLButton) And &H8000) Then
' If a ListView SubItem is double clicked...
Call GetCursorPos(lvhti.pt)
Call ScreenToClient(m_hwndLV, lvhti.pt)
If (ListView_SubItemHitTest(m_hwndLV, lvhti) <> LVI_NOITEM) Then
If lvhti.iSubItem Then
' Get the SubItem's label (and icon) rect.
If ListView_GetSubItemRect(m_hwndLV, lvhti.iItem, lvhti.iSubItem, LVIR_LABEL, rc) Then
' Either set the ListView as the TextBox parent window in order to
' have the TextBox Move method use ListView client coords, or just
' map the ListView client coords to the TextBox's paent Form
' Call SetParent(m_hwndTB, m_hwndLV)
Call MapWindowPoints(m_hwndLV, 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
' Save the one-based index of the ListItem and the zero-based index
' of the SubItem(if the ListView is sorted via the API, then ListItem.Index
' will be different than lvhti.iItem +1...)
m_iItem = lvhti.iItem + 1
m_iSubItem = lvhti.iSubItem
' Put the SubItem's text in the TextBox, save the SubItem's text,
' and clear the SubItem's text.
Text1 = ListView1.ListItems(m_iItem).SubItems(m_iSubItem)
Text1.Tag = Text1
ListView1.ListItems(m_iItem).SubItems(m_iSubItem) = ""
' Make the TextBox the topmost Form control, make the it visible, select
' its text, give it the focus, and subclass it.
Text1.ZOrder 0
Text1.Visible = True
Text1.SelStart = 0
Text1.SelLength = Len(Text1