Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблемы Selected в ListView LVS_EX_CHECKBOXES / 1 сообщений из 1, страница 1 из 1
14.05.2010, 14:15
    #36628192
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы Selected в ListView LVS_EX_CHECKBOXES
Собственно не так чтоб проблемы, но "хотелось БЫ".

1) Как сделать так, чтоб при выделении Item сама галочка не выделялась. Т.е. вместо верхнего рисунка получалось как на нижнем (галочка не закрашивается), уж больно мрачно это на классике.


2) Как сделать так, чтобы рисунок в Items/SubItems имел подсветку выделения, а не белый цвет фона ListView, ибо если это и нормально смотрится в Item, то белый разрыв в SubItem не всегда смотрится.

Один из вариантов: использовать белый цвет фона в картинке вместо прозрачного/MaskColor, но думаю, может сильно подвести, если цвет фона ListView вдруг окажется не белым. Т.е. нет ли другого универсального метода?

3) Хочется, чтоб событие ItemSelected следовало за событием Item_checked/unchecked, по умолчанию при установке/снятии галки Item не берет выделение на себя.
Для Control-6 это решается простым рабочим кодом:
Код: plaintext
1.
2.
Private Sub ListView1_ItemCheck(ByVal Item As MSComctlLib.ListItem)
    Item.Selected=True
End Sub
Для Control-5 начинаем сажать огород и мучать родителя:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Public Function NewFormPWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'для событий FormP т.е. FormP-родитель ListView1-реализация события ListView1_ItemCheck(Control 5)
    Select Case Msg
        ' ======================================================
        Case WM_NOTIFY
            Static lvcd As NMLVCUSTOMDRAW
            MoveMemory lvcd, ByVal lParam, Len(lvcd)   ' every structs' member is a Long
            Select Case lvcd.nmcd.hdr.code
                Case LVN_ITEMCHANGED
                    Select Case lvcd.nmcd.hdr.hwndFrom 'в смысле какой контрол толкнул речь
                        Case FormP.ListView1.hWnd
                            'выделяем элемент, кот. изменился(где checked/unchecked)
                            If FormP.ListView1.ListItems.Count > (lvcd.iSubItem +  1 ) Then
                                'FormP.ListView1.ListItems(lvcd.iSubItem + 1).Selected = True
                                'ListViewSelectItem FormP.ListView1, lvcd.iSubItem + 1
                            End If
                        Case Else
                    End Select 'lvcd.nmcd.hdr.hwndFrom
                Case Else
            End Select ' lvcd.nmcd.hdr.code
        Case Else
    End Select   ' Msg
    NewFormPWindowProc = CallWindowProc( _
        OldFormPWindowProc, hWnd, Msg, wParam, _
        lParam)
End Function


Public Sub ListViewSelectItem(m_ListView As ComctlLib.ListView, m_Item As Long)
   Dim lvi As LV_ITEM
   With lvi
      .mask = LVIF_STATE
      .state = &HF
      .stateMask = LVIS_SELECTED 'Or LVIS_FOCUSED
   End With
   Call SendMessage(m_ListView.hWnd, LVM_SETITEMSTATE, m_Item -  1 , lvi)
End Sub

Но здесь подводный камень:
LVN_ITEMCHANGED не совсем равносильно _ItemCheck (это более слабое условие)

Т.е. как сделать уточнение, что LVN_ITEMCHANGED вызвано именно _ItemCheck?

Потому как данный код хорошо годится для отслеживания состояния галок в Real Time, но не для озвученной цели. Ибо выделение чекнутого итема однозначно вызывет цепную реакцию из событий LVN_ITEMCHANGED для других Item-ов и рез-тат не достигается

vb-шный вариант
FormP.ListView1.ListItems(lvcd.iSubItem + 1).Selected = True вылетает сразу

API-шный вариант
ListViewSelectItem FormP.ListView1, lvcd.iSubItem + 1
глючит(не снимает выделение с предыдущего Item, хотя заказано MultiSelect=false), и все равно все в итоге вылетает.

Почему вылетает понятно, даже не спрашиваю об этом, выше ответил на этот вопрос.
Вопрос собственно как ужесточить условие LVN_ITEMCHANGED -> <_ItemCheck >?
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблемы Selected в ListView LVS_EX_CHECKBOXES / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]