1 (изменено: inseption86, 2024-04-23 20:01:34)

Тема: AHK: Добавление иконки на выделенную строку в ListView (GUI)

Добрый день! Как добавить иконку только на определённую строку?


Gui, Add, ListView, r20 w700 gLV vLV, Name|Size (KB)

ImageListID := IL_Create(1)
IL_Add(ImageListID, "shell32.dll", 147) 

Loop, %A_MyDocuments%\*.*
    LV_Add("", A_LoopFileName, A_LoopFileSizeKB)
	
LV_ModifyCol() 
LV_ModifyCol(2, "Integer")  

Gui, Show
return


LV:
if (A_GuiEvent = "DoubleClick")
{
	LV_SetImageList(ImageListID)
	LV_Modify(LV_GetNext(), "Icon1")
}
return

2

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

А что с заголовком?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

teadrinker заголовком?

4

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

Он не отражает вопрос.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

inseption86
Если думаете, что стало лучше, то нет. Из заголовка должно быть понятно, в чём вопрос.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

Думаю не лучший вариант.

Gui, Add, ListView, r20 w700 gLV vLV, Name|Size (KB)


Loop, %A_MyDocuments%\*.*
    LV_Add("", A_LoopFileName, A_LoopFileSizeKB)
	
LV_ModifyCol() 
LV_ModifyCol(2, "Integer")  

Gui, Show
return 

LV:
if (A_GuiEvent = "DoubleClick")
{ 
	IL_Destroy(ImageListID) 
	ImageListID := IL_Create(LV_GetCount())
	sel := LV_GetNext()
	Loop % LV_GetCount()
	{ 	 
		IL_Add(ImageListID, "shell32.dll", A_Index = sel ? 147 : 0) 
		LV_Modify(A_Index, "Icon" A_Index) 
	}
	LV_SetImageList(ImageListID) 
}
return

Вместо нулевой иконки можно подставить свою картинку в виде фона, типа что картинки и нет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

Как-то сложно у тебя вышло, попроще:

Gui, Add, ListView, r20 w700 gLV vLV, % "     Name|Size (KB)"

imageList := IL_Create()
IL_Add(imageList, "shell32", 44)
IL_Add(imageList, "shell32", 50)
LV_SetImageList(imageList) 

Loop, Files, %A_MyDocuments%\*.*
{
    LV_Add("Icon2", A_LoopFileName, A_LoopFileSizeKB)
}
	
LV_ModifyCol() 
LV_ModifyCol(2, "Integer 70")

Gui, Show
return

LV() {
    if (A_GuiEvent = "DoubleClick") {
        sel := LV_GetNext()
        Loop % LV_GetCount() {
            LV_Modify(A_Index, "Icon" . (A_Index = sel ? "1" : "2"))
        }
    }
}

GuiClose() {
    ExitApp
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

Ну супер, красава!
Я и сказал что вариант не очень, ну и пустой значок не искал.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

У меня в заголовке добавлены пробелы в качестве отступа, но если заморочиться, туда вроде тоже иконку можно вставить, по крайней мере чекбокс вставлялся точно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

В заголовке что то вставлять, не припомню такого.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

Вот чекбокс, иконку по идее как-то подобным образом можно:

Gui, Add, Listview, x0 y0 h200 w400 hwndhLV, Title1|Title2
header := SetHeaderItemCheckBox(hLV, 1)
OnMessage(0x4E, Func("WM_NOTIFY").Bind(header, 1))
Gui, Show, h200 w400

Loop 2 {
   LV_Add(, 111, 222)
   LV_ModifyCol(A_Index, "autohdr")
}
return

GuiClose() {
   ExitApp
}

SetHeaderItemCheckBox(hListView, item) {
   static LVM_GETHEADER := 0x101F, HDS_CHECKBOXES := 0x400, HDI_FORMAT := 0x4
        , HDM_FIRST := 0x1200, HDM_GETITEM := HDM_FIRST + (A_IsUnicode ? 3 : 11)
        , HDM_SETITEM := HDM_GETITEM + 1, HDF_CHECKBOX := 0x40
        , HDITEM_SIZE := 4*6 + A_PtrSize*6, fmt_offset := 4*3 + A_PtrSize*2
        
   SendMessage, LVM_GETHEADER,,,, ahk_id %hListView%
   WinExist("ahk_id" header := ErrorLevel)
   WinSet, Style, +%HDS_CHECKBOXES%
   VarSetCapacity(HDITEM, HDITEM_SIZE, 0)
   NumPut(HDI_FORMAT, HDITEM)
   SendMessage, HDM_GETITEM, --item, &HDITEM
   fmt := NumGet(HDITEM, fmt_offset, "Int")
   NumPut(fmt|HDF_CHECKBOX, HDITEM, fmt_offset)
   SendMessage, HDM_SETITEM, item, &HDITEM
   Return header
}

WM_NOTIFY(header, item, wp, lp) {
   static HDN_ITEMSTATEICONCLICK := -16, HDI_FORMAT := 0x4, HDF_CHECKED := 0x80
        , HDM_FIRST := 0x1200, HDM_GETITEM := HDM_FIRST + (A_IsUnicode ? 3 : 11)
        , HDITEM_SIZE := 4*6 + A_PtrSize*6, fmt_offset := 4*3 + A_PtrSize*2
        , prevChecked := 0
        
   if NumGet(lp+0) = header && NumGet(lp + A_PtrSize*2, "Int") = HDN_ITEMSTATEICONCLICK {
      VarSetCapacity(HDITEM, HDITEM_SIZE, 0)
      NumPut(HDI_FORMAT, HDITEM)
      SendMessage, HDM_GETITEM, --item, &HDITEM,, ahk_id %header%
      checked := NumGet(HDITEM, fmt_offset, "Int") & HDF_CHECKED
      if (checked != prevChecked) {
         prevChecked := checked
         ToolTip, % "Header's checkbox is " . (checked ? "" : "un") . "checked"
      }
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

Про чекбокс в первой колонке знаю, но вот про иконки в колонках всё таки подобным образом не соображу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Добавление иконки на выделенную строку в ListView (GUI)

teadrinker пишет:

попроще:

Можно ещё проще:

LV() {
    static sel := 1
    if (A_GuiEvent = "DoubleClick") {
        LV_Modify(sel, "Icon2")
        LV_Modify(sel := LV_GetNext(), "Icon1")
    }
}
serzh82saratov пишет:

не соображу

А что там соображать-то, всё довольно понятно написано.

Gui, Add, ListView, r20 w700 gLV hwndhLV, Name|Size (KB)

imageList := IL_Create()
IL_Add(imageList, "shell32", 44)
IL_Add(imageList, "shell32", 50)
LV_SetImageList(imageList)

Loop, Files, %A_MyDocuments%\*.*
{
    LV_Add("Icon2", A_LoopFileName, A_LoopFileSizeKB)
}
	
LV_ModifyCol() 
LV_ModifyCol(2, "Integer 70")

SetHeaderItemIcon(hLV, 1, imageList, 1)

Gui, Show
return

LV() {
    static sel := 1
    if (A_GuiEvent = "DoubleClick") {
        LV_Modify(sel, "Icon2")
        LV_Modify(sel := LV_GetNext(), "Icon1")
    }
}

GuiClose() {
    ExitApp
}

SetHeaderItemIcon(hListView, item, imageList, imageNum) {
    static LVM_GETHEADER := 0x101F, HDM_SETIMAGELIST := 0x1208
         , HDM_GETITEM := 0x1200 + (A_IsUnicode ? 3 : 11)
         , HDM_SETITEM := HDM_GETITEM + 1
         , HDI_FORMAT := 0x4, HDI_IMAGE := 0x20, HDF_IMAGE := 0x800
         , fmt_offset := 12 + A_PtrSize * 2

    SendMessage, LVM_GETHEADER,,,, ahk_id %hListView%
    WinExist("ahk_id " . ErrorLevel)
    SendMessage, HDM_SETIMAGELIST,, imageList
    VarSetCapacity(HDITEM, 24 + A_PtrSize * 6, 0)
    NumPut(HDI_FORMAT|HDI_IMAGE, HDITEM)
    SendMessage, HDM_GETITEM, --item, &HDITEM
    fmt := NumGet(HDITEM, fmt_offset, "Int")
    NumPut(--imageNum, HDITEM, 16 + A_PtrSize * 3)
    NumPut(fmt|HDF_IMAGE, HDITEM, fmt_offset)
    SendMessage, HDM_SETITEM, item, &HDITEM
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder