Custom Draw и иконки ListView

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Custom Draw и иконки ListView

Сообщение SLIM » 03.04.2011 (Вс) 13:51

Раньше сталкивался, но обычно забивал.
Есть ListView, стиль lvreport.
Добавляю item с флагом LVIF_TEXT с помощью LVM_INSERTITEM.
Далее через LVM_SETITEM выставляю subitem-ы, один из них с флагами LVIF_TEXT|LVIF_IMAGE.
В итоге получаю, что иконка рисуется и в первом столбце и в нужном.
Пробовал выставлять -1 в iImage при вставке Item-а - появляется пустое место просто. Некрасиво.

Порывшись по форумам, обнаружил что ListView автоматов выставляет иконки для первой колонки, если ставится иконка в любой другой. Что за фигня?
Начал копать в CustomDraw. Получая уведомление о рисовании Item-а нужно убрать иконку и все тут.

В свое время заливку и шрифты через NM_CUSTOMDRAW я менял удачно. Но вот с иконками никогда не работал.
И не знаю как подступиться. Как _не_ рисовать иконку?
Попробовал получить rect item-а и залить его FillRect. Получил заливку того же самого места, где должна быть иконка.

Подскажите что-нибудь пожалуйста.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Custom Draw и иконки ListView

Сообщение Хакер » 03.04.2011 (Вс) 14:33

SLIM писал(а):Порывшись по форумам, обнаружил что ListView автоматов выставляет иконки для первой колонки, если ставится иконка в любой другой. Что за фигня?

У тебя же есть исходники DUA? Что мешает посмотреть, как эта проблема решается там?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Custom Draw и иконки ListView

Сообщение SLIM » 03.04.2011 (Вс) 14:37

Исходника у меня не было.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Custom Draw и иконки ListView

Сообщение Хакер » 03.04.2011 (Вс) 14:39

Изучай
Код: Выделить всё
Private Function UpdateEnumProc(ByVal UpdId As Long, ByVal pLocation As Long, ByVal iSize As Long, ByVal iTime As Long, ByVal iTargetType As DCS_UPDATE_TARGET_TYPES, ByVal iTargetGroupId As Long, ByVal pTargetGroupName As Long, ByVal pTargetDealerId As Long, ByVal pTargetDealerName As Long) As Long
    Dim sLocation As String
   
    Dim sDealerId As String
    Dim sTargetName As String
   
   
    Dim ThisUpdId As Long
    sLocation = StrConv(SysAllocStringByteLen(ByVal pLocation, lstrlenA(pLocation)), vbUnicode)
   
    Do
        If UpdatePtr > Updates.Count Then Exit Do
        ThisUpdId = UpdateIdFromKey(Updates(UpdatePtr).Key)
        If ThisUpdId < UpdId Then
            frmMain.LvUpdates.ListItems.Remove Updates(UpdatePtr).Key
            Updates.Remove UpdatePtr
        ElseIf ThisUpdId = UpdId Then
            If Updates(UpdatePtr).Text <> sLocation Then Updates(UpdatePtr).Text = sLocation
            UpdatePtr = UpdatePtr + 1
           
            GoTo SubitemsInitialization
        Else
            Updates.Add frmMain.LvUpdates.ListItems.Add(, "upd" + CStr(UpdId), sLocation, "update", "update"), "upd" + CStr(UpdId), UpdatePtr
            Updates("upd" + CStr(UpdId)).Tag = " | "
            UpdatePtr = UpdatePtr + 1
            GoTo SubitemsInitialization
        End If
    Loop

    Updates.Add frmMain.LvUpdates.ListItems.Add(, "upd" + CStr(UpdId), sLocation), "upd" + CStr(UpdId)
    UpdatePtr = UpdatePtr + 1
    Updates("upd" + CStr(UpdId)).EnsureVisible
    Updates("upd" + CStr(UpdId)).Tag = " | "
   
SubitemsInitialization:
    With Updates("upd" + CStr(UpdId))
        Dim sKnownObjectKey As String
        Dim liinfo As LVITEM
        Dim i As Long
        i = .Index - 1
        With liinfo
            .Mask = LVIF_IMAGE
            .iItem = i
            .iSubItem = 2
            .iImage = 0
        End With
       
        Dim PrevTagTokens As Variant
        PrevTagTokens = Split(.Tag, "|", 2)
       
        If Val(PrevTagTokens(0)) <> iSize Then
            .SubItems(1) = GetRoundedSize(iSize)
            Debug.Print "size change"
        End If
       
       
        .Tag = CStr(iSize) + "|"
       
        Select Case iTargetType
            Case DCS_UPDATE_TARGET_TYPE_ALL
                sKnownObjectKey = "*"
                liinfo.iImage = I_IMAGENONE
           
            Case DCS_UPDATE_TARGET_TYPE_GROUP
                sKnownObjectKey = "gr" + CStr(iTargetGroupId)
                liinfo.iImage = frmMain.Icons.ListImages("group").Index - 1
           
            Case DCS_UPDATE_TARGET_TYPE_DEALER
                sDealerId = StrConv(SysAllocStringByteLen(ByVal pTargetDealerId, lstrlenA(pTargetDealerId)), vbUnicode)
                sKnownObjectKey = "d_" + sDealerId
                liinfo.iImage = frmMain.Icons.ListImages("dealer").Index - 1
        End Select
       
        On Error Resume Next
            sTargetName = KnownTargets(sKnownObjectKey)
        On Error GoTo 0
       
        If StrPtr(sTargetName) = 0 Then
            If iTargetType = DCS_UPDATE_TARGET_TYPE_DEALER Then
                sTargetName = StrConv(SysAllocStringByteLen(ByVal pTargetDealerName, lstrlenA(pTargetDealerName)), vbUnicode)
            Else
                sTargetName = StrConv(SysAllocStringByteLen(ByVal pTargetGroupName, lstrlenA(pTargetGroupName)), vbUnicode)
            End If
            KnownTargets.Add sTargetName, sKnownObjectKey
        End If
       
        If .SubItems(2) <> sTargetName Then
            .SubItems(2) = sTargetName
            Debug.Print "targ chg"
        End If
               
        .Tag = .Tag + sKnownObjectKey
       
        Dim sNewDate As String
        sNewDate = Format(DateAdd("s", iTime, UnixEpoch), "dd.mm.yyyy hh:mm:ss")
        If .SubItems(3) <> sNewDate Then
            .SubItems(3) = sNewDate
            Debug.Print "dt chg"
        End If
       
       
        If PrevTagTokens(1) <> sKnownObjectKey Then
            Call SendMessage(frmMain.LvUpdates.hWnd, LVM_SETITEM, 0, liinfo)
            liinfo.iImage = frmMain.Icons.ListImages("update").Index - 1
            liinfo.iSubItem = 0
            Call SendMessage(frmMain.LvUpdates.hWnd, LVM_SETITEM, 0, liinfo)
        End If
       
    End With
   
   
End Function
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Custom Draw и иконки ListView

Сообщение BV » 03.04.2011 (Вс) 14:39

У нас аналогичный вопрос остался без ответа http://forum.sources.ru/index.php?showtopic=312057
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Custom Draw и иконки ListView

Сообщение Хакер » 03.04.2011 (Вс) 14:46

Ответ простой: сначала выставить иконки для суб-итемов с помощью LVM_SETITEM, потом с помощью LVM_SETITEM-же выставить главную иконку, считая её за 0-ой суб-итем.
Added: Хотя там вроде о другом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Custom Draw и иконки ListView

Сообщение SLIM » 03.04.2011 (Вс) 15:00

Хакер писал(а):Ответ простой: сначала выставить иконки для суб-итемов с помощью LVM_SETITEM, потом с помощью LVM_SETITEM-же выставить главную иконку, считая её за 0-ой суб-итем.
Added: Хотя там вроде о другом.

А я пробовал SETITEM делать сразу после INSERTINTEM.
Не помогло.
Не помогло и SETITEM после установки всех subitem-ов.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Custom Draw и иконки ListView

Сообщение Хакер » 03.04.2011 (Вс) 18:35

SLIM писал(а):Не помогло и SETITEM после установки всех subitem-ов.

Перед тобою код, который делал указанное, причём работающую программы ты видел воочию. Ищи у себя ошибку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Custom Draw и иконки ListView

Сообщение SLIM » 04.04.2011 (Пн) 0:51

Может версия Common Controls не так.
Ты какую брал?
Пишите жизнь на чистовик.....переписать не удастся.....

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Custom Draw и иконки ListView

Сообщение Antonariy » 04.04.2011 (Пн) 12:08

Версия СС всего одна — та, которая в системе, и "взять" какую-то другую нельзя.
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList