Помогите...
Хочу как на второй картинке, но ума не хватает. В WinApi - дуб.
И вообще, возможно-ли сделать так? Если да - подскажите, пожалуйста.
Отредактировано Andruk (15.02.2025 14:50:19)
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » ListIconGadget и подпункты
Помогите...
Хочу как на второй картинке, но ума не хватает. В WinApi - дуб.
И вообще, возможно-ли сделать так? Если да - подскажите, пожалуйста.
Отредактировано Andruk (15.02.2025 14:50:19)
Я сейчас в Linux, но для LV есть константы с GROUP в имени, которые позволяют вставить пункт имеющий другой вид, который группирует список. В AutoIt3 функция называлась _GUICtrlListView_EnableGroupView и связанные с ней несколько функций. В WinAPI это LVM_ENABLEGROUPVIEW, попробуй поискать в код-архиве или на оф.форуме.
Для WinXP группы не поддерживались и мне приходилось просто выделять имя группы цветом текста, при этом пункт был как и все пункты, с такими же свойствами, кроме другого цвета.
Если надо именно как вложенный и при этом ставить галочки на родительский, то у LV есть возможность выставить две иконки в пункт, в итоге первую иконку-флажок можно сделать для родителя, а для дочерних первый пустой, а второй собственный рисованный флажок.
А колонки обязательно? А то TV можно сделать, без геморроя.
Отредактировано AZJIO (15.02.2025 15:35:26)
А колонки обязательно? А то TV можно сделать, без геморроя.
В том-то и дело, что обязательно...
Спасибо, буду искать по вашей наводке.
Ну или придется делать как делали вы - просто выделять имя группы цветом.
Отредактировано Andruk (15.02.2025 18:13:33)
Тут нет?
Ссылка не работает...
Интересная задача. Только у заголовков не включаются 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)
Интересная задача. Только у заголовков не включаются 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
Вот при удалении строк (штатными средствами) группа удаляется только если все строки удалялись
по порядку (сверху вниз).
Что-то форум не открывается
https://www.autohotkey.com/boards/viewt … amp;t=6686
только я в autohotkey не шарю:(
SendMessage_ (GadgetID(#ListIcon), #LVM_REMOVEGROUP, 3, 0) SendMessage_ (GadgetID(#ListIcon), #LVM_REMOVEGROUP, 2, 0) SendMessage_ (GadgetID(#ListIcon), #LVM_REMOVEGROUP, 1, 0)
Спасибо!
Группы удаляются, но вот если удалять по одной строке не по порядку, то одна остается и ее надо удалить еще раз
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)
Вы здесь » PureBasic - форум » Вопросы по PureBasic » ListIconGadget и подпункты