Что нового

Как удалить иконку пункта ListViewItem

erlik

Продвинутый
Сообщения
317
Репутация
84
Есть список - ListView. Cоздается нативными функциями
-
Код:
GUICtrlCreateListView и GUICtrlCreateListViewItem, стиль списка BitOR($WS_VSCROLL,$WS_HSCROLL,$LVS_LIST,$LVS_SMALLICON), иконки в список добавляются через GUICtrlSetImage
одновременно с элементами списка
Код:
GUICtrlCreateListViewItem ($sDescription, $aLists[0])
             If $aMenuObjects[$i][3] <> "" Then
		Local $aIconSource = GetIconSource($aMenuObjects[$i][3])
		GUICtrlSetImage(-1,  $aIconSource[0], $aIconSource[1])
	EndIf

Для того, чтобы понятно что за список и зачем там иконки - смотрите под спойлером:
Элемента списка могут изменятся по мере редактирования данных в элементах ввода.
Проблема возникает на этапе удаления иконки из элемента - точнее после него, так как иконка благополучно удаляется, но поскольку удаляется она варварским способом (другого просто не нашел)
Код:
_SendMessage($hListCashCommands, $LVM_DELETEITEM, $iLastIndex)
; удаляем иконку у пункта путем вставки  пункта с тем же текстом на то же место, но с несуществующим индексом изображения  - 1024
Local $iIndex=_GUICtrlListView_InsertItem($hListCashCommands, $aMenuObjects[$iLastIndex][2], $iLastIndex,1024); при -1 иконка не удаляется, а меняется на неправильную
; заменяем идентификатор пункта в таблице. $iLastIndex и $iIndex совершенно совпадают поэтому нет разницы, что использовать.
$aMenuObjects[$iLastIndex][9]=_GUICtrlListView_MapIndexToID($aLists[0], $iLastIndex)

И после того как пункт был заменен функцией _GUICtrlListView_InsertItem уже невозможно что либо с ним сделать, так как новый идентификатор пункта оказывается неправильным(иногда он совпадает с уже имеющимися id пунктов, иногда нет - суть в том что он уже не является однозначно ассоциированным с этим пунктом). И иконки, предназначенные ему, либо вставляются чужому элементу, либо не вставляются вовсе (хотя бывает, что все срабатывает правильно - один-два раза.) После обновления списка путем нажатия на элемент TreeViewItem все иконки разумеется появляются на своих местах, так как таблица данных полностью пересоздается, и, можно, конечно, забить на такую мелочь, но все же хотелось бы как то это разрулить по-человечески.
Поэтому вот собственно суть вопроса: есть ли другой способ удаления иконки пункта (созданного нативными функциями) без удаления самого элемента ListViewItem ?
PS: GUIImageList не предлагать - в данном случае с ним еще больше гемороя.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
; #FUNCTION# ====================================================================================================================
; Name ..........: GUICtrlDeleteImage
; Description ...: Delete an image set by GUICtrlSetImage.
; Syntax ........: GUICtrlDeleteImage($iControlID)
; Parameters ....: $iControlID          - A valid control ID.
; Return values .: Success - 1
;                  Failure - 0
; Author ........: guinness
; Example .......: Yes
; ===============================================================================================================================
Func GUICtrlDeleteImage($iControlID)
    Local Const $IMAGE_ICON = 0x0001
    Local $iReturn = GUICtrlSendMsg($iControlID, $BM_SETIMAGE, $IMAGE_ICON, 0)
    If $iReturn = 0 Then
        $iReturn = GUICtrlSetImage($iControlID, 'shell32.dll', -50)
    EndIf
    Return Number($iReturn > 0)
EndFunc   ;==>GUICtrlDeleteImage
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
firex
Огромное спасибо. :smile: То, что нужно.
------------------------------------------------------------
По большому счету этой функции самое место в числе нативных - странно, что ничего подобного изначально не предусмотрели. Ну или хотя бы в справку ее добавить - а то ведь три дня потратил на решение сей проблемы.
 
Верх