powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / xp/vista style; common controls 5/6; regsvr32 на x86/x64
12 сообщений из 62, страница 3 из 3
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585563
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyС высотой ничего в голову не приходит.
Да бог с ним. Уже подретушировал-извратился. Вставил один Toolbar в другой. Внешний 420 и обеспечивает "полоску" между меню и Toolbar. Внутренний 435 (т.к. 17х17 ) и его Top чуть смещен вниз, т.е. кнопки получились как бы посредине высоты внешнего Toolbar и низ скрыт. Получилось думаю нормально.

Счас занимаюсь самым мерзким Listview, ломаю голову над другим

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Const LVM_FIRST = &H1000
Public Const LVM_SETIMAGELIST = (LVM_FIRST +  3 )

'LVM_SETIMAGELIST
Public Const LVSIL_NORMAL =  0  'large icons
Public Const LVSIL_SMALL =  1  'small icons
Public Const LVSIL_STATE =  2  'state images
Public Const LVSIL_GROUPHEADER =  3  'for group header

...
    For i =  0  To  2 
        lRes = SendMessage(ListView1(i).hWnd, LVM_SETIMAGELIST, LVSIL_NORMAL, ByVal ImageListListView.hImageList)
        lRes = SendMessage(ListView1(i).hWnd, LVM_SETIMAGELIST, LVSIL_SMALL, ByVal ImageListListView.hImageList)
        lRes = SendMessage(ListView1(i).hWnd, LVM_SETIMAGELIST, LVSIL_GROUPHEADER, ByVal ImageListHead.hImageList)
    Next i

Вопрос конечно в LVSIL_GROUPHEADER . Не хочет ImageList-ы назначать-никакие.
По крайней мере использовать не получается.

Если сравнивать с Toolbar (полный код приведен выше), то там используется некая фишка:
Код: plaintext
1.
2.
    ' Get the toolbar handle (we cannot just use tbrMain.hwnd as this is a container
    ' window for the actual toolbar control)
    hTBar = FindWindowEx(Toolbar1.hWnd,  0 &, "ToolbarWindow32", vbNullString)
и все работает в лучшем виде, но я не уверен что для ListView надо делать

Код: plaintext
  hLview = FindWindowEx(ListView1(i).hWnd,  0 &, "ListViewWindow32", vbNullString)

Т.е. в Control-5 он тупо использует ImageListListView для header-ов, если назначить два первых ImageList через VB, а если их не назначать и пытаться применять LVM_SETIMAGELIST (при неназначенных ImageList) то картинок нет нигде.

И еще странность, но пока не копал.
У меня ширины столбцов для ListView считываются из реестра. Если запомнить их при закрытии приложения кот. Control-6 а потом открыть в Control-5 то столбцы сильно шире, и походу при тех же значениях Width. Ощущение что использует другие координаты. Можно конечно подкоректировать default-ы, но мне тогда придется удалять ветвь реестра где эти ширины хранятся при инсталляции новой версии, а не хотелось бы. А если не удалить то будет похабство при первом запуске, и user должен будет уменьшать их вручную.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585638
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет LVSIL_GROUPHEADER. Заголовки столбцов это отдельный контрол:
Код: plaintext
1.
2.
Function pvHeaderhWnd() As Long
    If (m_hListView) Then pvHeaderhWnd = SendMessageLong(m_hListView, LVM_GETHEADER,  0 ,  0 )
End Function
Ему нужно присваивать ImageList персонально:
Код: plaintext
Call SendMessageLong(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , m_hILHeader)
авторно я не уверен что для ListView надо делатьНадо, надо. Не надо вот это:
Код: plaintext
lRes = SendMessage(ListView1(i).hWnd, LVM_SETIMAGELIST, LVSIL_GROUPHEADER, ByVal ImageListHead.hImageList)
авторУ меня ширины столбцов для ListView считываются из реестра. Если запомнить их при закрытии приложения кот. Control-6 а потом открыть в Control-5 то столбцы сильно шире, и походу при тех же значениях Width. Ощущение что использует другие координаты. Тоже на это натыкался, но не понял, в чем засада. Просто сделал кнопку, устанавливающую размеры по умолчанию, если расползутся. Происходит это редко.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585886
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
пытаюсь по вашему методу:

Код: 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.
Public Const LVM_GETHEADER =  4127 
Public Const HDM_FIRST           As Long = &H1200
Public Const HDM_SETIMAGELIST    As Long = (HDM_FIRST +  8 )


'SendMessage function
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long

'-----------------------------

    Dim pvHeaderhWnd As Long
    For i =  0  To  2 
        pvHeaderhWnd = SendMessage(ListView1(i).hWnd, LVM_GETHEADER,  0 ,  0 )
        'MsgBox pvHeaderhWnd
        Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal ImageListHead.hImageList)
    Next i
'----
    If StartParam.SortOrderIn =  0  Then
        ListView1( 0 ).SortOrder = lvwAscending
        With lvFormat
            .mask = LVCF_FMT Or LVCF_IMAGE
            .fmt = LVCFMT_IMAGE Or LVCFMT_BITMAP_ON_RIGHT  '
            .iImage = ImageListHead.ListImages("Ascending").Index -  1 
        End With
'....
    Call SendMessage(ListView1( 0 ).hWnd, LVM_SETCOLUMN, ListView1( 0 ).SortKey, lvFormat)

Не хочет...Ощущение что пытаюсь забить тот же гвоздь, но другим кувалдометром. MsgBox pvHeaderhWnd показывает вроде похожие на правду Long-и,
а HDM_SETIMAGELIST видимо не срабатывает, т.к. функция, что дальше, лепит картинку из основного ImageList, а не из желаемого.

Вашу SendMessage Long я конечно вижу, ну попытался еще вот так вот

Код: plaintext
1.
2.
3.
4.
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As Long) As Long
но это ничего не дало.

Вообще-то...
>лепит картинку из основного ImageList
М-м-м...то что лепит это уже неплохо...
а не проще ли забить и добавить 3 лишние картинки в основной ImageList, жалко что ли...
Пусть оттуда их и берет. Что думаете?

==================================

AntonariyавторУ меня ширины столбцов для ListView считываются из реестра. Если запомнить их при закрытии приложения кот. Control-6 а потом открыть в Control-5 то столбцы сильно шире, и походу при тех же значениях Width. Ощущение что использует другие координаты. Тоже на это натыкался, но не понял, в чем засада. Просто сделал кнопку, устанавливающую размеры по умолчанию, если расползутся. Происходит это редко.
Дык расползутся они только один раз - при установке новой версии с "5" после старой версии с "6". (если user уже устанавливал программу ранее) Деинсталлятор старой версии не удаляет эти параметры из реестра. Единственный способ удалить при установке новой версии.
Они по разному интерпретируют одну и ту же ширину . Для "5" дефолты придется тупо уменьшить методом теста.
Или они еще "в процессе" могут глючить? Если так, то не радует...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585967
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Вообще-то...
>лепит картинку из основного ImageList
М-м-м...то что лепит это уже неплохо...
а не проще ли забить и добавить 3 лишние картинки в основной ImageList, жалко что ли...
Пусть оттуда их и берет. Что думаете?
Это дурной вариант..У меня размерность картинки другая: в основном листе 16х16, а в заголовках 12х12, можно конечно добавить поля по 2 с каждой стороны, но это съест место, опять эстетика пострадает...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36586667
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, разобрался
Вот это не работало
Код: plaintext
Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal ImageListHead.hImageList)
т.к. я это делал слишком рано (в Form_load), из _Activate все заработало.

Теперь воюю с прозрачным цветом иконок в Listview-Header.
В Control-6 они будучи загнанными в ImageList изначально (иконки с прозрачными местами) были по умолчанию прозрачными.

Здесь:
Код: plaintext
1.
2.
3.
    For i =  0  To PictureHead.Count -  1 
        ImageListHead.ListImages.Add , PictureHead(i).Tag, PictureHead(i).Picture
    Next i
    Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal ImageListHead.hImageList)
не фурычит, белый фон, можно сделать ButtonFace фон, но на XP-интерфейсе при наведении мыши оно себя выдает.

Пытался уже битмапы в ресурсы загонять, например делаю фон синим и типа

Код: plaintext
1.
2.
3.
4.
5.
    m_hImageList = ImageList_Create( 16 ,  16 , ILC_COLOR32 Or ILC_MASK,  1 ,  1 )
    ImageList_Add m_hImageList, LoadResPicture( 101 , vbResBitmap).Handle, vbBlue
    ImageList_Add m_hImageList, PictureHead( 1 ).Picture.Handle, vbBlue
    ImageList_Add m_hImageList, PictureHead( 2 ).Picture.Handle, vbBlue

    Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal m_hImageList)

Не могу понять сути этой MaskColor. Что делать-то? Лучше конечно с обычными ico, кот. загружены в Picturebox-ы с бесцветным фоном и обычным ImageList, там тоже этот MaskColor есть,
но помогает только Backcolor, да и то не до конца, как выяснили.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36586937
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Не могу понять сути этой MaskColor. Что делать-то?Суть в том, что imagelist самостоятельно делает прозрачными области указанного цвета. Такие области называются маской. Свойство ImageLis'а MaskColor задает этот цвет.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36588429
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

для самого ListView это работает, а для header оно лепит цвет фона, в чем и проблема.
Тестовый пример

P.S. А файлы как нормально тут прилеплять?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36589118
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю чего с этой прозрачностью делать.
По идее можно попытаться менять цвет фона ImageList, видимо читая цвет какого-то пикселя, как это придумал с TabStrip.
Но здесь куча сложностей:
1) Выделяется только один header, а фон един для всех картинок.
2) Надо будет эти картинки каждый раз перерисовывать-обновлять
3) Надо думать как считать текущий цвет каждого header
4) Надо еще понимать событие при кот. столбец меняет цвет. понятно сабклассинг этих хидеров (у меня это headres кажется и так сабклассятся, но от этого не легче).
5) а если там в xp гребаные градиенты используются как в TabStrip то вообще ж., фиг отследишь где чего и почему меняется.
Сдается мне, путь сей не есть правильный и как то проще делается.
Для кнопки напр. этот MaskColor надо задавать и он должен совпадать с MaskColor для ImageList. А с header я нигде никакого намека на это не вижу(автоматически здесь не работает). Но с 6-ми контролами вроде по default-у они прозрачные получаются (в смысле плюют на цвет фона), значит в API чего-то должно быть.
---------------------------------

А по поводу ширины столбцов. Не, там хуже. ColumnHeaders(i).width надо выкидывать в помойку сразу и не думая. Простые тесты показывают, что если 1-100; 2-200 ; 3-300 то ширина устанавливается не линейно, а по какой-то логарифмической шкале, и мало того что дикая нелинейность, если эти значения пытаться запоминать, то эта мерзость фиг их потом еще и отобразит также (т.е. реальные ширины будут в след. раз другие).
Но здесь хотя бы выход наклевывается. Что-нибудь типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub Command1_Click()
    Dim lvFormat As LV_COLUMN
    With lvFormat
        .mask = LVCF_WIDTH
    End With
    Call SendMessage(ListView1.hWnd, LVM_GETCOLUMN,  0 , lvFormat)
    MsgBox lvFormat.cx * Screen.TwipsPerPixelX
    
End Sub

Private Sub Command2_Click()
    Dim lvFormat As LV_COLUMN
    With lvFormat
        .mask = LVCF_WIDTH
        .cx = Text1.Text / Screen.TwipsPerPixelX 'Text1.Text -ширина в точках
    End With
    Call SendMessage(ListView1.hWnd, LVM_SETCOLUMN,  0 , lvFormat)
End Sub
будет думаю хорошим решением. Округляет конечно при делении, но более чем на 5-10точек не прыгает.Завтра буду мучиться, применять этот код.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36593731
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77для самого ListView это работает, а для header оно лепит цвет фона, в чем и проблема.
Получилось. Чего только не пытался.
Уже вот это накопал
Код: plaintext
1.
2.
3.
4.
5.
6.
  Dim hdi As HDITEM
  With hdi
    .mask = HDI_FORMAT Or HDI_IMAGE
    .fmt = HDF_STRING Or HDF_IMAGE Or HDF_BITMAP_ON_RIGHT '
    .iImage =  0 
  End With
  Call SendMessage(hwndHdr, HDM_SETITEM,  1 , hdi)
вместо
Код: plaintext
1.
2.
3.
4.
5.
6.
    Dim lvFormat As LV_COLUMN
    With lvFormat
        .mask = LVCF_FMT Or LVCF_IMAGE
        .fmt = LVCFMT_IMAGE Or LVCFMT_BITMAP_ON_RIGHT  '
        .iImage = ImageListHead.ListImages("Ascending").Index '2
    End With
    Call SendMessage(ListView1( 0 ).hWnd, LVM_SETCOLUMN,  1 , lvFormat)
Помог вот этот пример:
http://btmtz.mvps.org/listview/
http://btmtz.mvps.org/listview/lvheadersorticons.zip
Вернее все-таки понимание(или так фишка легла) что здесь VB ImageList не прокатит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
' ImageList_Create flags
Private Const ILC_MASK = &H1
Private Const ILC_COLOR32 = &H20

Private Declare Function ImageList_Create Lib "comctl32.dll" (ByVal cx As Long, _
ByVal cy As Long, ByVal flags As Long, ByVal cInitial As Long, ByVal cGrow As Long) As Long
Private Declare Function ImageList_ReplaceIcon Lib "comctl32.dll" (ByVal himl As Long, _
ByVal i As Long, ByVal hIcon As Long) As Long
...
Private Sub Form_Load()
'необходимо создать ImageList через API, иначе прозрачность иконок не сработает
    m_Himl = ImageList_Create( 12 ,  12 , ILC_MASK Or ILC_COLOR32,  3 ,  0 ) '
    ImageList_ReplaceIcon m_Himl, - 1 , PictureHead( 0 ).Picture.Handle 'Paper=0
    ImageList_ReplaceIcon m_Himl, - 1 , PictureHead( 1 ).Picture.Handle 'Ascending=1
    ImageList_ReplaceIcon m_Himl, - 1 , PictureHead( 2 ).Picture.Handle 'Descending=2
...
Private Sub Form_Activate()
    Dim pvHeaderhWnd As Long
    Dim i As Integer
    Dim lvFormat As LV_COLUMN
    For i =  0  To  2 
        pvHeaderhWnd = SendMessageLong(ListView1(i).hWnd, LVM_GETHEADER,  0 ,  0 )
        Call SendMessageLong(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal m_Himl) 'ImageListHead.hImageList)  '
    Next i

Кстати вопрос. Как уже упомянул,
>Вашу SendMessageLong я конечно вижу
Так вот в тестовом(мелком) примере у меня строчка (без Long)
Код: plaintext
Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal m_Himl)
съелась, а в большом проекте взяла и сглючила Bad Dll Convention.. типа того, а с SendMessageLong (as Long вместо as Any) прокатило. В чем засада?

-----------------------

На Висте в некоторых программах (но далеко не всех) примеры: Почта Виндоус, Fax and Scan listview имеет какой-то другой вид, т.е. не только шапка по-вистовски, но и сами Items в Report выглядят по-вистовски, т.е. с закругленными выделениями-примечаниями и с голубой прозрачной подсветкой. Это как сделать? Или это вообще принципиально другой контрол?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36608765
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyавторУ меня ширины столбцов для ListView считываются из реестра. Если запомнить их при закрытии приложения кот. Control-6 а потом открыть в Control-5 то столбцы сильно шире, и походу при тех же значениях Width. Ощущение что использует другие координаты. Тоже на это натыкался, но не понял, в чем засада. Просто сделал кнопку, устанавливающую размеры по умолчанию, если расползутся. Происходит это редко.
Собственно, давно уже до этого сам допер. Но если интересно, официальное заключение:
FIX: Problem with ListView's ColumnHeader Width Property

How To Set the Column Width of Columns in a ListView Control

Принялся пока курочить другой свой exe-шник.
Новая проблема:

Код: plaintext
1.
2.
3.
    tmColour = ListView.ListItems(k +  1 ).ForeColor
    ListView.ListItems(k).ForeColor = tmColour
    ListView.ListItems(k).ListSubItems( 1 ).ForeColor = tmColour
    ListView.ListItems(k).ListSubItems( 2 ).ForeColor = tmColour


Изучаю пока вот это чудо:
http://btmtz.mvps.org/listview/
LVCustomDraw: How to use custom draw in the ListView
http://btmtz.mvps.org/listview/lvcustomdraw.zip

Неужели только сабклассить и NMLVCUSTOMDRAW ?
Или можно че попроще придумать?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36610139
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Новая проблема:

Код: plaintext
1.
2.
3.
    tmColour = ListView.ListItems(k +  1 ).ForeColor
    ListView.ListItems(k).ForeColor = tmColour
    ListView.ListItems(k).ListSubItems( 1 ).ForeColor = tmColour
    ListView.ListItems(k).ListSubItems( 2 ).ForeColor = tmColour

Осилил:
Код: 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.
Public Function NewFormWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    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 NM_CUSTOMDRAW
                    Select Case lvcd.nmcd.dwDrawStage
                    ' ====================================================
                        Case CDDS_PREPAINT
                            ' Tell the listview we want CDDS_ITEMPREPAINT for each item
                            NewFormWindowProc = CDRF_NOTIFYITEMDRAW
                            Exit Function
                        ' ====================================================
                        Case CDDS_ITEMPREPAINT
                            Select Case lvcd.nmcd.hdr.hwndFrom 'в смысле какой контрол собрался перерисовываться
                                Case Form1.ListView1.hwnd
                                    'в Tag храним информацию о цвете строчки, если пусто, то по умолчанию
                                    If Len(Form1.ListView1.ListItems(lvcd.nmcd.dwItemSpec +  1 ).Tag) >  0  Then
                                        lvcd.clrText = Val(Form1.ListView1.ListItems(lvcd.nmcd.dwItemSpec +  1 ).Tag)
                                        'lvcd.clrTextBk = vbRed 'background of item, если надо
                                        MoveMemory ByVal lParam, lvcd, Len(lvcd)
                                        Exit Function
                                    End If
                                Case Else
                            End Select 'lvcd.nmcd.hdr.hwndFrom
                        Case Else
                    End Select   ' lvcd.nmcd.dwDrawStage
                Case Else
            End Select   ' nmh.code
        Case Else
    End Select   ' Msg
    NewFormWindowProc = CallWindowProc( _
        OldFormWindowProc, hwnd, Msg, wParam, _
        lParam)
End Function
Сабклассить надо родительский контрол.
В моем случае ListView был вставлен в PictureBox, а PictureBox был вставлен во Frame, а Frame вставлен в Form.
Чтобы добраться до этой "иголки", пришлось сабклассить PictureBox, этого оказалось достаточно.
Таблицу цветов строчек храню в их Tag-ах, т.е. достаточно
Item.tag=vbBlue
Listview1.Refresh
===============================
но Refresh на 5-х контролах свинит, т.е.даже не рефреш, а попытка изменить Item/SubItem кот. Selected но вне зоны видимости программно.
Т.е. у вас ListView напр. отображает строка=500, а selected строка=2
и программа меняет вам эту строку=2.(через vb-модель)
Дык вот свинья в том, что этот гад перепрыгнет на вторую строчку.
Если скажем у вас содержание ListView обновляется по таймеру(отдельные строки), то вы будете тянуть HScroll вниз, а эта скотина будет тянуть вас вверх.
Посему пришлось накатать еще ряд ф-ций, плюс быстро понял, что если с SubItems/Image начинаешь работать через API, то это можно даже без лишних сабклассингов, но VB-модель надо хоронить с момента первого применения API, ибо двояко(через API и через VB) можно прочитать разве что Item.Text , попытки двойного обращения будут вести к бардаку в голове и программе.

Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Public Const MAX_LVMSTRING As Long =  255 

Public Sub ListViewSetSubItemText(m_ListView As ComctlLib.ListView, m_Item As Long, m_SubItem As Long, m_Text As String)
    ' m_SubItem =0 почему-то вылетает не вылетает лишь если or LVIF_IMAGE
    Dim lvi As LV_ITEM
    With lvi
        .iItem = m_Item -  1 
        .iSubItem = m_SubItem
        .mask = LVIF_TEXT
        .pszText = m_Text
    End With
    Call SendMessage(m_ListView.hwnd, LVM_SETITEM,  0 , lvi)
End Sub
Public Sub ListViewSetItemPicture(m_ListView As ComctlLib.ListView, m_Item As Long, m_Image As String)
    Dim lvi As LV_ITEM
    With lvi
        .iItem = m_Item -  1 
        .iSubItem =  0 
        .mask = LVIF_IMAGE
        .iImage = m_Image
    End With
    Call SendMessage(m_ListView.hwnd, LVM_SETITEM,  0 , lvi)
End Sub

Public Function ListViewGetSubItemText(m_ListView As ComctlLib.ListView, m_Item As Long, m_SubItem As Long) As String
    'm_SubItem =0 прочтет item.text (0 можно устанавливать через vb-модель)
    Dim lvi As LV_ITEM
    Dim nRet As Long
    
    With lvi
        .mask = LVIF_TEXT
        .iSubItem = m_SubItem
        .pszText = Space(MAX_LVMSTRING) 'Space(32) '
        .cchTextMax = Len(.pszText)  'MAX_LVMSTRING
    End With
    nRet = SendMessage(m_ListView.hwnd, LVM_GETITEMTEXT, m_Item -  1 , lvi)
    ListViewGetSubItemText = Left$(lvi.pszText, nRet)
End Function
Public Function ListViewGetItemPicture(m_ListView As ComctlLib.ListView, m_Item As Long) As Long
    Dim lvi As LV_ITEM
    Dim nRet As Long
    
    With lvi
        .mask = LVIF_IMAGE
        .iItem = m_Item -  1 
        .iSubItem =  0 
    End With
    Call SendMessage(m_ListView.hwnd, LVM_GETITEM,  0 , lvi)
    ListViewGetItemPicture = lvi.iImage
End Function


================================
Хотелось бы тут вспомнить про Toolbar.
AntonariyДмитрий77Хотелось бы каких-то идей-направлений (хотя бы).NM_CUSTOMDRAW
Antonary, ну допустим влезу я во все это (первый опыт типа есть)
Код: 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.
' ==================================================================
' Toolbar

Public Type NMTBCUSTOMDRAW
  nmcd As NMCUSTOMDRAW
  hbrMonoDither As Long
  hbrLines As Long                ' For drawing lines on buttons
  hpenLines As Long             ' For drawing lines on buttons

  clrText As Long                  ' Color of text
  clrMark As Long                 ' Color of text bk when marked. (only if TBSTATE_MARKED)
  clrTextHighlight As Long    ' Color of text when highlighted
  clrBtnFace As Long            ' Background of the button
  clrBtnHighlight As Long      ' 3D highlight
  clrHighlightHotTrack As Long  ' In conjunction with fHighlightHotTrack will cause button to highlight like a menu
  rcText As RECT                       ' Rect for text

  nStringBkMode As Long
  nHLStringBkMode As Long
End Type

'  Toolbar custom draw return flags
Public Const TBCDRF_NOEDGES = &H10000                    ' Don't draw button edges
Public Const TBCDRF_HILITEHOTTRACK = &H20000       ' Use color of the button bk when hottracked
Public Const TBCDRF_NOOFFSET = &H40000                   ' Don't offset button if pressed
Public Const TBCDRF_NOMARK = &H80000                       ' Don't draw default highlight of image/text for TBSTATE_MARKED
Public Const TBCDRF_NOETCHEDEFFECT = &H100000   ' Don't draw etched effect for disabled items
А я сумею под него картинку подложить? Или только фон поменять монотонно (ну наверно на Transparent)?

И допустим я вымучаю все и вся и что-то сделаю. А всякие NM_<VISTA>DRAW или NM<XP>DRAW пошлют мой NMCUSTOMDRAW куда подальше. Простой пример для классики то есть, я ссылку давал, но XP/Vista стили действие того примера обнуляют, здесь небось тоже самое будет...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36610572
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А я сумею под него картинку подложить?NMCUSTOMDRAW.hdc в полном вашем распоряжении.
...
Рейтинг: 0 / 0
12 сообщений из 62, страница 3 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / xp/vista style; common controls 5/6; regsvr32 на x86/x64
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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