PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » ListIconGadget и подпункты


ListIconGadget и подпункты

Сообщений 1 страница 10 из 10

1

Помогите...
Хочу как на второй картинке, но ума не хватает. В WinApi - дуб.

https://forumupload.ru/uploads/0009/ae/28/775/179359.jpg

И вообще, возможно-ли сделать так? Если да - подскажите, пожалуйста.

Отредактировано Andruk (15.02.2025 14:50:19)

0

2

Я сейчас в Linux, но для LV есть константы с GROUP в имени, которые позволяют вставить пункт имеющий другой вид, который группирует список. В AutoIt3 функция называлась _GUICtrlListView_EnableGroupView и связанные с ней несколько функций. В WinAPI это LVM_ENABLEGROUPVIEW, попробуй поискать в код-архиве или на оф.форуме.
Для WinXP группы не поддерживались и мне приходилось просто выделять имя группы цветом текста, при этом пункт был как и все пункты, с такими же свойствами, кроме другого цвета.

Если надо именно как вложенный и при этом ставить галочки на родительский, то у LV есть возможность выставить две иконки в пункт, в итоге первую иконку-флажок можно сделать для родителя, а для дочерних первый пустой, а второй собственный рисованный флажок.

А колонки обязательно? А то TV можно сделать, без геморроя.

Отредактировано AZJIO (15.02.2025 15:35:26)

0

3

Тут нет?
http://forums.purebasic.com/english/vie … hp?t=54153

0

4

AZJIO написал(а):

А колонки обязательно? А то TV можно сделать, без геморроя.

В том-то и дело, что обязательно...
Спасибо, буду искать по вашей наводке.

Ну или придется делать как делали вы - просто выделять имя группы цветом.

Отредактировано Andruk (15.02.2025 18:13:33)

0

5

egons написал(а):

Тут нет?

Ссылка не работает...

0

6

Интересная задача. Только у заголовков не включаются checkbox:(

Код:
;https://www.purebasic.fr/english/viewtopic.php?t=54153
; --> Structure used to define Group
Structure LVGROUP1 Align #PB_Structure_AlignC
  cbSize.l
  mask.l
  *pszHeader
  cchHeader.l
  *pszFooter
  cchFooter.l
  iGroupId.l
  stateMask.l
  state.l
  uAlign.l
EndStructure ;: Global lvg.LVGROUP1

; --> Structure used to define Vista+ Group
Structure LVGROUP1_v6 Extends LVGROUP1 Align #PB_Structure_AlignC
  *pszSubtitle
  cchSubtitle.l
  *pszTask
  cchTask.l
  *pszDescriptionTop
  cchDescriptionTop.l
  *pszDescriptionBottom
  cchDescriptionBottom.l
  iTitleImage.l
  iExtendedImage.l
  iFirstItem.l
  cItems.l
  *pszSubsetTitle
  cchSubsetTitle.l
EndStructure ;: Global lvg.LVGROUP1_v6



; --> Structure used for placing item into it's Group
Structure LVITEM1 Align #PB_Structure_AlignC
  mask.l
  iItem.l
  iSubItem.l
  state.l
  stateMask.l
  *pszText
  cchTextMax.l
  iImage.l
  lParam.i
  iIndent.l
  iGroupId.l
  cColumns.l
  puColunns.l
EndStructure

; ; --> Structure used for changing Group colors
; Structure LVGROUPMETRICS  Align #PB_Structure_AlignC
;  cbSize.l 
;  mask.l 
;  left.l 
;  top.l 
;  right.l
;  bottom.l 
;  crLeft.l 
;  crTop.l 
;  crRight.l
;  crBottom.l
;  crHeader.l
;  crFooter.l
; EndStructure ;: Global lvGM.LVGROUPMETRICS

#LVGS_NORMAL = $0
#LVGF_SUBTITLE = $100

; Structure INITCOMMONCONTROLSEX 
;   dwSize.l 
;   dwICC.l 
; EndStructure 

; InitICC.INITCOMMONCONTROLSEX 
; InitICC\dwSize  = SizeOf(INITCOMMONCONTROLSEX)  
; InitICC\dwICC   = #ICC_STANDARD_CLASSES ; #ICC_LISTVIEW_CLASSES ;#ICC_DATE_CLASSES 
; 
; InitCommonControlsEx_(@InitICC)
; 
; Procedure ListIcon_SetGTextColor(gadget.l, colour.l)
;   ; --> Change Group header text color
;   ; --> AFAIK, Group Metrics applies to all Groups
;   lvGM.LVGROUPMETRICS
;   lvGM\cbSize = SizeOf(LVGROUPMETRICS)
;   lvGM\mask = #LVGMF_TEXTCOLOR
;   lvGM\crHeader = colour
;   
;   SendMessage_(GadgetID(gadget), #LVM_SETGROUPMETRICS, 0, @lvGM)
; EndProcedure

Procedure ListIcon_AddSubTitle(gadget.l, text.s, groupid.l)   ;;;; Vista+ Function
  lvg.LVGROUP1_v6
  lvg\cbSize = SizeOf(LVGROUP1_v6)
  lvg\mask + #LVGF_SUBTITLE 
  
  sLen = Len(text)  
  CompilerIf #PB_Compiler_Unicode = 0   
    Subtitle_uc.s = Space(sLen*2+2)
    PokeS(@Subtitle_uc,text,sLen,#PB_Unicode)
    lvg\pszSubtitle = @Subtitle_uc
    
  CompilerElse
    lvg\pszSubtitle = @text
  CompilerEndIf
  
  SendMessage_ (GadgetID(gadget), #LVM_SETGROUPINFO, groupid, @lvg)
EndProcedure

Procedure ListIcon_DelSubTitle(gadget.l, groupid.l)  ;;;; Vista+ Function
  lvg.LVGROUP1_v6
  lvg\cbSize = SizeOf(LVGROUP1_v6)
  lvg\mask -#LVGF_SUBTITLE
  
  SendMessage_ (GadgetID(gadget), #LVM_SETGROUPINFO, groupid, @lvg)
EndProcedure

Procedure ListIcon_AddGroup(gadget.l, text.s, groupid.l = 0, state.l = 0, mask.l = 0, Image=-1)
  Static lGroupID.l = 0
  If groupid : lGroupID = groupid : Else : lGroupID+1 : EndIf
  
  lvg.LVGROUP1
  lvg\cbSize = SizeOf(LVGROUP1)
  lvg\mask = #LVGF_GROUPID | #LVGF_ALIGN | #LVGF_HEADER
  lvg\iGroupId = lGroupID
  lvg\uAlign = #LVGA_HEADER_LEFT

  If state
    lvg\state = state
  EndIf
  
  If  mask
    lvg\mask + mask
  EndIf  
  
  sLen = Len(text)
  CompilerIf #PB_Compiler_Unicode = 0
    text_uc.s = Space(sLen*2+2)
    PokeS(@text_uc,text,sLen,#PB_Unicode)
    lvg\pszHeader = @text_uc 
  CompilerElse
    lvg\pszHeader = @text
  CompilerEndIf
  
  SendMessage_ (GadgetID(gadget), #LVM_INSERTGROUP, -1, @lvg)
EndProcedure


Procedure ListIcon_EnableGroupView(gadget.l, state.l=1)
  SendMessage_(GadgetID(gadget), #LVM_ENABLEGROUPVIEW, state, 0)
EndProcedure


Procedure ListIcon_AddItem(gadget.l, text.s, groupid.l = 0, pos.l = 0, image=-1)
  Static lGroupID.l = 0, lPos.l = 0
  Protected CountSubItem.l , Index, Buff.s
  
  If groupid : lGroupID = groupid : EndIf
  If pos : lPos = pos : EndIf
  
  CountSubItem = CountString( text , Chr(10))
  text2.s = StringField(text, 1, Chr(10))
  
  itm.LVITEM1\mask = #LVIF_TEXT
  itm\pszText = @text2
  
  If lGroupID
    itm\mask + #LVIF_GROUPID
    itm\iGroupId = lGroupID
  Else
    itm\iItem = lPos
  EndIf   
  SendMessage_ (GadgetID(gadget), #LVM_INSERTITEM, 0, @itm)
  
  
  For Index = 1 To CountSubItem
    subitm.LVITEM1\mask = #LVIF_TEXT | #LVIF_GROUPID | #LVIF_DI_SETITEM
    Buff = StringField(text, Index + 1, Chr(10))
    subitm\mask = #LVIF_TEXT
    subitm\pszText = @Buff
    subitm\iGroupId = groupid
    subitm\iItem = 0
    subitm\iSubItem = Index
    SendMessage_ (GadgetID(gadget), #LVM_SETITEM, 0, @subitm) 
  Next
EndProcedure



Enumeration
  #Window
  #ListIcon
EndEnumeration


Procedure ListIcon_AddItem_Ex(Gadget.b, Row.b, Column.b, Text.s, ImageIndex.b)
  var.lvITEM1
  
  Var\mask = #LVIF_IMAGE | #LVIF_TEXT 
  Var\iItem = Row ; row number for change 
  Var\iSubItem = Column ; item 
  Var\pszText = @Text ; text to change to 
  Var\iImage = ImageIndex; index of icon in the list 
  
  If Column = 0
    SendMessage_(GadgetID(Gadget), #LVM_INSERTITEM, 0, @Var) 
  Else
    SendMessage_(GadgetID(Gadget), #LVM_SETITEM, 0, @Var) 
  EndIf
  
EndProcedure


If OpenWindow(#Window, 0, 0, 800, 700, "Single ListIcon Gadget Controls", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  ListIconGadget(#ListIcon, 5, 5, 290, 390, "Group Name(s)", 260)
  SetGadgetColor(#ListIcon, #PB_Gadget_BackColor, $92D7EB)  
  
  For k=1 To 3
    AddGadgetColumn(#ListIcon, k, "Column "+Str(k+1), 170)
  Next
  
  
  ListIcon_EnableGroupView(#ListIcon)
  
  ListIcon_AddGroup(#ListIcon, "Pre-Alpha")
  ListIcon_AddItem(#ListIcon, "Item 1 belongs to Pre-Alpha", 1)
  ListIcon_AddItem(#ListIcon, "Item 2 belongs to Pre-Alpha") 
  ListIcon_AddItem(#ListIcon, "Item 3 belongs to Pre-Alpha")
  
  
  ListIcon_AddGroup(#ListIcon, "Alpha")
  ListIcon_AddSubTitle(#ListIcon, "   Alpha SubTitle: blah, blah, blah",  2)
  
  ListIcon_AddItem(#ListIcon, "Item 1 belongs to Alpha", 2)
  ListIcon_AddItem(#ListIcon, "Item 2 belongs to Alpha")
  ListIcon_AddItem(#ListIcon, "Item 3 belongs to Alpha") 
  
  ListIcon_AddGroup(#ListIcon, "Beta", 0,  #LVGS_COLLAPSIBLE, #LVGF_STATE)
  ListIcon_AddItem(#ListIcon, "Item 1 belongs to Beta ", 3)
  ListIcon_AddItem(#ListIcon, "Item 2 belongs to Beta"+Chr(10)+"Column 2"+Chr(10)+"Column 3"+Chr(10)+"Column 4")
  ListIcon_AddItem(#ListIcon, "Item 3 belongs to Beta")  
  
  ListIcon_AddGroup(#ListIcon, "Final", 0,  #LVGS_COLLAPSIBLE|#LVGS_COLLAPSED, #LVGF_STATE)
  ListIcon_AddSubTitle(#ListIcon, "SubTitle: blah, blah, blah",  4)
  ListIcon_AddItem(#ListIcon, "Item 1 belongs to Final", 4)
  ListIcon_AddItem(#ListIcon, "Item 2 belongs to Final")
  ListIcon_AddItem(#ListIcon, "Item 3 belongs to Final"+Chr(10)+"Column 2"+Chr(10)+"Column 3"+Chr(10)+"Column 4")   
  
  ListIcon_AddItem(#ListIcon, "ItemX be Placed in First-Group", 1)
  ListIcon_AddItem(#ListIcon, "ItemY be Placed in Third-Group", 3)    
  
  ListIcon_AddGroup(#ListIcon, "Group Oops! Beta Again")
  
  ListIcon_AddItem(#ListIcon, "Item 1 belongs to Beta Again", 5)
  ListIcon_AddItem(#ListIcon, "Item 2 belongs to Beta Again")
  ListIcon_AddItem(#ListIcon, "Item 3 belongs to Beta Again")  
  
;   ListIcon_DelSubTitle(#ListIcon, 2) 
  
SendMessage_(GadgetID(#ListIcon),#LVM_SETEXTENDEDLISTVIEWSTYLE,0,#LVS_EX_CHECKBOXES)
  
  Quit.l = 0
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
      Case #PB_Event_SizeWindow
        ResizeGadget(#ListIcon, 5, 5, WindowWidth(#Window)-10, WindowHeight(#Window)-10)
    EndSelect
  Until Quit > 0
EndIf
End

Отредактировано egons (17.02.2025 10:17:06)

0

7

egons написал(а):

Интересная задача. Только у заголовков не включаются checkbox:(

Интересно, но выглядит как-то не очень (для моей задачи).
Мне не хватает знаний разобраться. Малость подсократил для своих нужд...

Код:
Structure LVGROUP1 Align #PB_Structure_AlignC
  cbSize.l
  mask.l
  *pszHeader
  cchHeader.l
  *pszFooter
  cchFooter.l
  iGroupId.l
  stateMask.l
  state.l
  uAlign.l
EndStructure

Structure LVITEM1 Align #PB_Structure_AlignC
  mask.l
  iItem.l
  iSubItem.l
  state.l
  stateMask.l
  *pszText
  cchTextMax.l
  lParam.i
  iIndent.l
  iGroupId.l
EndStructure

Procedure ListIcon_AddGroup(gadget.l, text.s, groupid.l = 0, mask.l = 0)
  Static lGroupID.l = 0
  If groupid : lGroupID = groupid : Else : lGroupID+1 : EndIf
  
  lvg.LVGROUP1
  lvg\cbSize = SizeOf(LVGROUP1)
  lvg\mask = #LVGF_GROUPID | #LVGF_ALIGN | #LVGF_HEADER
  lvg\iGroupId = lGroupID
  lvg\uAlign = #LVGA_HEADER_LEFT
  lvg\pszHeader = @text
  
  SendMessage_ (GadgetID(gadget), #LVM_INSERTGROUP, -1, @lvg)
EndProcedure


Procedure ListIcon_AddItem(gadget.l, text.s, groupid.l = 0, pos.l = 0)
  Static lGroupID.l = 0, lPos.l = 0
  Protected CountSubItem.l , Index, Buff.s
  
  If groupid : lGroupID = groupid : EndIf
  If pos : lPos = pos : EndIf
  
  CountSubItem = CountString( text , Chr(10))
  text2.s = StringField(text, 1, Chr(10))
  itm.LVITEM1\mask = #LVIF_TEXT
  itm\pszText = @text2
  
  If lGroupID
    itm\mask + #LVIF_GROUPID
    itm\iGroupId = lGroupID
  Else
    itm\iItem = lPos
  EndIf
  
  SendMessage_ (GadgetID(gadget), #LVM_INSERTITEM, 0, @itm)
   
  For Index = 1 To CountSubItem
    subitm.LVITEM1\mask = #LVIF_TEXT | #LVIF_GROUPID | #LVIF_DI_SETITEM
    Buff = StringField(text, Index + 1, Chr(10))
    subitm\mask = #LVIF_TEXT
    subitm\pszText = @Buff
    subitm\iGroupId = groupid
    subitm\iItem = 0
    subitm\iSubItem = Index
    SendMessage_ (GadgetID(gadget), #LVM_SETITEM, 0, @subitm) 
  Next
EndProcedure

Enumeration
  #Window
  #ListIcon
EndEnumeration

If OpenWindow(#Window, 0, 0, 800, 700, "Single ListIcon Gadget Controls", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  ListIconGadget(#ListIcon, 5, 5, 762, 320, "Group Name(s)", 260)
  SetGadgetColor(#ListIcon, #PB_Gadget_BackColor, $E2E2E2)  
  
  For k=1 To 3
    AddGadgetColumn(#ListIcon, k, "Column "+Str(k+1), 166)
  Next
  
  SendMessage_(GadgetID(#ListIcon), #LVM_ENABLEGROUPVIEW, 1, 0)
  
  ListIcon_AddGroup(#ListIcon, "Pre-Alpha")
  ListIcon_AddItem(#ListIcon, "Item 1 belongs to Pre-Alpha", 1)
  ListIcon_AddItem(#ListIcon, "Item 2 belongs to Pre-Alpha") 
  ListIcon_AddItem(#ListIcon, "Item 3 belongs to Pre-Alpha"+Chr(10)+"Column 2")
  
  ListIcon_AddGroup(#ListIcon, "Alpha")
  ListIcon_AddItem(#ListIcon, "Item 1 belongs to Alpha", 2)
  ListIcon_AddItem(#ListIcon, "Item 2 belongs to Alpha")
  ListIcon_AddItem(#ListIcon, "Item 3 belongs to Alpha") 
  
  ListIcon_AddGroup(#ListIcon, "Beta")
  ListIcon_AddItem(#ListIcon, "Item 1 belongs to Beta ", 3)
  ListIcon_AddItem(#ListIcon, "Item 2 belongs to Beta"+Chr(10)+"Column 2"+Chr(10)+"Column 3"+Chr(10)+"Column 4")
  ListIcon_AddItem(#ListIcon, "Item 3 belongs to Beta")  
      
  SendMessage_(GadgetID(#ListIcon),#LVM_SETEXTENDEDLISTVIEWSTYLE,0,#LVS_EX_CHECKBOXES)
  
;   RemoveGadgetItem(#ListIcon, 8-0)
;   RemoveGadgetItem(#ListIcon, 8-1)
;   RemoveGadgetItem(#ListIcon, 8-2)
  
  Quit.l = 0
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
      Case #PB_Event_SizeWindow
        ResizeGadget(#ListIcon, 5, 5, WindowWidth(#Window)-10, WindowHeight(#Window)-10)
    EndSelect
  Until Quit > 0
EndIf
End

Вот при удалении строк (штатными средствами) группа удаляется только если все строки удалялись
по порядку (сверху вниз).

0

8

Что-то форум не открывается
https://www.autohotkey.com/boards/viewt … amp;t=6686

только я в autohotkey не шарю:(

0

9

Код:
SendMessage_ (GadgetID(#ListIcon), #LVM_REMOVEGROUP, 3, 0)
SendMessage_ (GadgetID(#ListIcon), #LVM_REMOVEGROUP, 2, 0)
SendMessage_ (GadgetID(#ListIcon), #LVM_REMOVEGROUP, 1, 0)

0

10

Спасибо!
Группы удаляются, но вот если удалять по одной строке не по порядку, то одна остается и ее надо удалить еще раз

Код:
SendMessage_ (GadgetID(#ListIcon), #LVM_DELETEITEM, 8, 0)
SendMessage_ (GadgetID(#ListIcon), #LVM_DELETEITEM, 6, 0)
SendMessage_ (GadgetID(#ListIcon), #LVM_DELETEITEM, 7, 0)

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

Да, это из-за того, что при удалении строки они меняют свои индексы... Дошло до жирафы.

Отредактировано Andruk (17.02.2025 23:23:14)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » ListIconGadget и подпункты