Страница: 1 |
Страница: 1 |
Вопрос: Скроллинг в ListView.
Добавлено: 09.12.07 20:16
Автор вопроса: b.a.m | ICQ: 291657044
Нужна помощь при работе с ListView. Допустим в свойствах ListVies поле View = lvwReport. При этом в ListView много записей и часть из них не отображается на экране. При пролистывании ListView с помощью скроллинга верхние запись уходят с поля видимости. Подскажите, как определить те поля, которые скрыты? и как, вообще, отлавливать, что применен скроллинг?
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #1
Добавлено: 10.12.07 01:43
К листу на апи от sne я приделал вот такую функу
Public Property Get ItemVisible(ByVal iIndex As Long) As Boolean
Dim rc1 As RECT, rc2 As RECT
rc1.Left = LVIR_BOUNDS
Call SendMessage(hListView, LVM_GETITEMRECT, iIndex, rc1)
Call GetClientRect(hLVParent, rc2)
If 0 < rc1.Bottom Then _
If rc2.Bottom > rc1.Top Then ItemVisible = True
'If 0 < rc1.Bottom Then _
' If rc2.Bottom > rc1.Top Then _
' If 0 < rc1.Right Then _
' If rc2.Right < rc1.Left Then ItemVisible = True
End Property
Номер ответа: 2
Автор ответа:
b.a.m
ICQ: 291657044
Вопросов: 2
Ответов: 6
Профиль | | #2
Добавлено: 11.12.07 19:29
Winand, спасибо, конечно, но можешь по подробнее расписать, а то я не врубился, что ты имеешь ввиду под "К листу на апи от sne я приделал вот такую функу "?
Номер ответа: 3
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #3
Добавлено: 12.12.07 13:12
А что тут непонятного? sne написал свой ListView на API, представленный в виде класса (без использования OCX)
Номер ответа: 4
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #4
Добавлено: 12.12.07 18:58
b.a.m, я думаю можно и с OCX-контролом юзать.
Вот таким образом:
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 Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_GETITEMRECT As Long = (LVM_FIRST + 14)
Private Const LVIR_BOUNDS As Long = &H0
Private Sub Command1_Click()
Debug.Print ItemVisible(84)
End Sub
Private Sub Form_Load()
Dim i As Long
For i = 0 To 99
lv.ListItems.Add , , i
Next i
End Sub
Public Property Get ItemVisible(ByVal iIndex As Long) As Boolean
Dim rc1 As RECT, rc2 As RECT
rc1.Left = LVIR_BOUNDS
Call SendMessage(lv.hwnd, LVM_GETITEMRECT, iIndex, rc1)
Call GetClientRect(lv.hwnd, rc2)
Debug.Print rc1.Left, rc1.Top, rc1.Right, rc1.Bottom
Debug.Print rc2.Left, rc2.Top, rc2.Right, rc2.Bottom
If 0 < rc1.Bottom Then _
If rc2.Bottom > rc1.Top Then _
If 0 < rc1.Right Then _
If rc2.Right > rc1.Left Then ItemVisible = True
'If 0 < rc1.Bottom Then _
' If rc2.Bottom > rc1.Top Then ItemVisible = True
End Property
(В первом варианте 'rc2.Right > rc1.Left')
Номер ответа: 5
Автор ответа:
b.a.m
ICQ: 291657044
Вопросов: 2
Ответов: 6
Профиль | | #5
Добавлено: 12.12.07 19:48
Winand? спасибо, что потратил время и объяснил! Большое СПАСИБО!!!