Jump to content

Treeview Icon Problems

Recommended Posts


I've been having some problems adding a icon from a .dll into a treeview,

Does the function _GUICtrlTreeView_SetIcon only allow you to use Shell icons or am i doing something wrong?

My main script is way to large to post up so I've created a short example to illustrate my problem

the resource file is attatched

#include <GUITreeView.au3>
#include <TreeViewConstants.au3>
#include <GUIConstants.au3>

Global $GUITree, $hTree

$hGUI = GUICreate("Example", 500, 500, -1, -1)
GUICtrlCreateLabel("Add Item Type ( 1 - 22 )", 220, 20)
$hCombo = GUICtrlCreateCombo("", 220, 40, 50, 22, 0x0003)
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22", "1")
$hCreate = GUICtrlCreateButton("Create Tree Item", 280, 39, 100, 22)

$GUITree = _GUICtrlTreeView_Add($hTree, 0, "hGUI")
_GUICtrlTreeView_SetIcon($GUITree, $GUITree, @ScriptDir&"\Resources.dll", 119)

While 1
    $hMsg = GUIGetMsg()
    Switch $hMsg
        Case -3
        Case $hCreate
            $hTreeItem = _AddTreeItem("Control Type "&GUICtrlRead($hCombo), GUICtrlRead($hCombo))

Func _AddTreeItem($aName, $aType)
    $hItem = _GUICtrlTreeView_AddChild($hTree, $GUITree, $aName)
    _GUICtrlTreeView_SetIcon($hTree, $hItem, @ScriptDir&"\Resources.dll", _GetIcon($aType))
    ConsoleWrite("+ _AddTreeItem("&$aName&", "&$aType&")    Icon # "&_GetIcon($aType)&@CRLF)
    Return $hItem

Func _GetIcon($Type)
    If $Type = 1 Then
        Return 122
    ElseIf $Type = 2 Then
        Return 102
    ElseIf $Type = 3 Then
        Return 121
    ElseIf $Type = 4 Then
        Return 114
    ElseIf $Type = 5 Then
        Return 105
    ElseIf $Type = 6 Then
        Return 129
    ElseIf $Type = 7 Then
        Return 107
    ElseIf $Type = 8 Then
        Return 123
    ElseIf $Type = 9 Then
        Return 111
    ElseIf $Type = 10 Then
        Return 127
    ElseIf $Type = 11 Then
        Return 120
    ElseIf $Type = 12 Then
        Return 128
    ElseIf $Type = 13 Then
        Return 135
    ElseIf $Type = 14 Then
        Return 138
    ElseIf $Type = 15 Then
        Return 126
    ElseIf $Type = 16 Then
        Return 136
    ElseIf $Type = 17 Then
        Return 133
    ElseIf $Type = 18 Then
        Return 124
    ElseIf $Type = 19 Then
        Return 116
    ElseIf $Type = 20 Then
        Return 113
    ElseIf $Type = 21 Then
        Return 118
    ElseIf $Type = 22 Then
        Return 104

Any help would be appreciated :)


Share this post

Link to post
Share on other sites

#include <GUITreeView.au3>

#include <TreeViewConstants.au3>

#include <GUIConstants.au3>

Global $GUITree, $hTree

$hGUI = GUICreate("Example", 500, 500, -1, -1)

GUICtrlCreateLabel("Add Item Type ( 1 - 22 )", 220, 20)

$hCombo = GUICtrlCreateCombo("", 220, 40, 50, 22, 0x0003)

GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22", "1")

$hCreate = GUICtrlCreateButton("Create Tree Item", 280, 39, 100, 22)



$GUITree = _GUICtrlTreeView_Add($hTree, 0, "hGUI")

_GUICtrlTreeView_SetIcon($hTree, $GUITree, @ScriptDir & "Resources.dll", -119)

; _GUICtrlTreeView_SetIcon($hTree, $GUITree, "shell32.dll", 39)

While 1

    Switch GUIGetMsg()

        Case -3


        Case $hCreate

            $hTreeItem = _AddTreeItem("Control Type " & GUICtrlRead($hCombo), GUICtrlRead($hCombo))




Func _AddTreeItem($aName, $aType)

    $hItem = _GUICtrlTreeView_AddChild($hTree, $GUITree, $aName)

    _GUICtrlTreeView_SetIcon($hTree, $hItem, @ScriptDir & "Resources.dll", _GetIcon($aType))

    ; _GUICtrlTreeView_SetIcon($hTree, $hItem, "shell32.dll", _GetIcon($aType))

    Return $hItem


Func _GetIcon($Type)

    Switch $Type

        Case 1

            Return -122

        Case 2

            Return -102

        Case 3

            Return -121

        Case 4

            Return -114

        Case 5

            Return -105

        Case 6

            Return -129

        Case 7

            Return -107

        Case 8

            Return -123

        Case 9

            Return -111

        Case 10

            Return -127

        Case 11

            Return -120

        Case 12

            Return -128

        Case 13

            Return -135

        Case 14

            Return -138

        Case 15

            Return -126

        Case 16

            Return -136

        Case 17

            Return -133

        Case 18

            Return -124

        Case 19

            Return -116

        Case 20

            Return -113

        Case 21

            Return -118

        Case 22

            Return -104



Share this post

Link to post
Share on other sites

AZJIO Thank You very much, i would have never of thought to make it negative.


Share this post

Link to post
Share on other sites

I'm trying to set a treeview icon using an icon from the Web, like this:

InetGet("https://www.fastmail.com/static/favicons/icon-64x64.png", @ScriptDir & "fastmail.png", 1, 1)
If Not FileExists(@ScriptDir & "fastmail.png") Then
    MsgBox(0, "Test", "Whoops! " & @ScriptDir & "\fastmail.png does not exist.")

$SetIcon = _GUICtrlTreeView_SetIcon($Tree, $L2_item, @ScriptDir & "fastmail.png")
If $SetIcon = "False" Then
    MsgBox(0, "Test", "Whoops! Icon not set.")

But it's not setting it. It does save the file, though.

I think the problem is that _GUICtrlTreeView_SetIcon() expects to retrieve an icon from an .exe or .dll rather than directly from an image file, like GUICtrlSetImage() does when setting an icon for a listview item or a button. But I don't know how to do that. Any idea? I'm building a treeview that shows bookmarks, and I want to display the icon for each bookmark.

Share this post

Link to post
Share on other sites

Icon <> Png

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • dimm
      By dimm
      Is it possible to compile script without any icon resources included?
      When I make exe it uses default system icon of current OS even if I compile as console application.
      On other versions of Windows it looks a little strange

      It seems that the only way is remove icons from exe after compilation using resource editors like ResHacker.

      another bad solution:
      Using corrupted 35 bytes icon file. Windows can't load it and shows default system icon.
      #pragma compile(Icon, broken.ico) broken.ico
    • xtcislove
      By xtcislove
      i stuck again,
      Im using this function to create a treeview from root dir.
      ;https://autoit.de/index.php?thread/86082-treeview-root-verbergen/&postID=691139#post691139 #include <File.au3> #include <WindowsConstants.au3> Global $sPath = @ScriptDir Global $hGui = GUICreate('TreeView-Example', 400, 600) Global $idTreeView = GUICtrlCreateTreeView(10, 10, 380, 580, Default, $WS_EX_CLIENTEDGE) GUISetState() _CreatePath($sPath, $idTreeView) Do Until GUIGetMsg() = -3 Func _CreatePath($sPath, $idParent) Local $aFolder, $aFiles, $idItem If StringRight($sPath, 1) <> '\' Then $sPath &= '\' $aFolder = _FileListToArray($sPath, '*', $FLTA_FOLDERS) If Not @error Then For $i = 1 To $aFolder[0] $idItem = GUICtrlCreateTreeViewItem($aFolder[$i], $idParent) _CreatePath($sPath & $aFolder[$i], $idItem) Next EndIf $aFiles = _FileListToArray($sPath, '*', $FLTA_FILES) If @error Then Return For $i = 1 To $aFiles[0] $idItem = GUICtrlCreateTreeViewItem($aFiles[$i], $idParent) Next EndFunc Folder Structure:

      If a file exists in multiple folders, i like to color it red, if not green. 

      I know how to do this for files, but nut for the folders.

      Because if there is only 1 file in Folder2 that is also in Folder1 that it should only color this single file red, inlcuding its whole tree.

      The Folder1 and Folder2 should be red in this case, too. Other files and trees should stay green.
      Basically i like to color a file and its belonging tree red if the file exists more than 1 time.
    • xtcislove
      By xtcislove

      im searching like 6 hours and i didnt found the right solution.

      Im trying to build a treeview from a directory and its subfolders etc.

      This function give me right treeview, but i cant color each item seperated.

      #include <GuiTreeView.au3> $hGui = GUICreate("Demo1", 600, 400) $hTreeView = _GUICtrlTreeView_Create($hGui, 10, 10, 580, 380) GUISetState() _GUICtrlTreeView_BeginUpdate($hTreeView) ListFiles_ToTreeView(@ScriptDir, 0) _GUICtrlTreeView_EndUpdate($hTreeView) Do Until GUIGetMsg() = -3 Func ListFiles_ToTreeView($sSourceFolder, $hItem) Local $sFile ; Force a trailing \ If StringRight($sSourceFolder, 1) <> "\" Then $sSourceFolder &= "\" ; Start the search Local $hSearch = FileFindFirstFile($sSourceFolder & "*.*") ; If no files found then return If $hSearch = -1 Then Return ; This is where we break the recursive loop <<<<<<<<<<<<<<<<<<<<<<<<<< ; Now run through the contents of the folder While 1 ; Get next match $sFile = FileFindNextFile($hSearch) ; If no more files then close search handle and return If @error Then ExitLoop ; This is where we break the recursive loop <<<<<<<<<<<<<<<<<<<<<<<<<< ; Check if a folder If @extended Then ; If so then call the function recursively ListFiles_ToTreeView($sSourceFolder & $sFile, _GUICtrlTreeView_AddChild($hTreeView, $hItem, $sFile)) Else ; If a file than write path and name _GUICtrlTreeView_AddChild($hTreeView, $hItem, $sFile) EndIf WEnd ; Close search handle FileClose($hSearch) EndFunc ;==>ListFiles_ToTreeView
      So i am searching for the exact same function just with
      instead of 
      Ps: i have a folder structure where i like to color each item green if a file only exist once and red if it exist more than once.

      Could someone help?

    • FrancescoDiMuro
      By FrancescoDiMuro
      Good evening everyone
      First, I want to apologize with you for the title not very clear, but I thought a little bit on which title to set at the thread, and this is the one that came in mind.
      Now, let me explain what I'm trying to understand.

      I am making an application ( with n clients ), with an SQLite Database, which has a Main form, and n sub-forms... 
      Since these sub-forms are called several times, because they are used to add or update records to the Database, I put the code that generates the GUI of these sub-forms in Functions.
      There are two sub-forms which are "treated" as two main forms, since even them have n sub-forms, which perform various tasks.
      Where am I stucked?

      For the Main form I created a Status Bar, in order to display messages ( add/delete/update/search results ), and it works perfectly with all the forms which don't have other sub-forms.
      For the two forms, which indeed have n sub-forms, I created two separated Status Bars, which are (re)created everytime I call the function that then displays the form.
      Practically, I can't set icons to these two Status Bars, and I don't know why.
      I'm really sorry that I don't feel clear enough, so, here you are an example of what I am saying.
      I recreated exactly what my script does:
      #include <GuiButton.au3> #include <GUIConstantsEx.au3> #include <GuiStatusBar.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) Global $frmSubForm, _ $txtSubFormField, _ $sbSubFormStatusBar, _ $objSB_IconError = _WinAPI_LoadShell32Icon(109), _ $objSB_IconInformation = _WinAPI_LoadShell32Icon(277) #Region ### START Koda GUI section ### Form= $frmMainForm = GUICreate("Main Form", 300, 300, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, "ExitApplication") $sbMainStatusBar = _GUICtrlStatusBar_Create($frmMainForm) $btnCreateSubForm = GUICtrlCreateButton("Create Sub Form", 105, 110, 75, 41, BitOR($BS_CENTER,$BS_VCENTER,$BS_MULTILINE)) GUICtrlSetOnEvent(-1, "GenerateSubForm") GUICtrlSetFont(-1, 10, 400, 0, "Arial") _GUICtrlStatusBar_SetSimple($sbMainStatusBar) _GUICtrlStatusBar_SetText($sbMainStatusBar, "") GUISetState(@SW_SHOW, $frmMainForm) #EndRegion ### END Koda GUI section ### While 1 Sleep(100) WEnd Func ExitApplication() Exit EndFunc Func GenerateSubForm() #Region ### START Koda GUI section ### Form= $frmSubForm = GUICreate("Sub-Form", 300, 300, -1, -1, -1, -1, $frmMainForm) GUISetOnEvent($GUI_EVENT_CLOSE, "DeleteSubForm") $txtSubFormField = GUICtrlCreateInput("", 0, 0, 100, 20) $btnCheckSubFormField = GUICtrlCreateButton("Check Field", 105, 110, 75, 41, BitOR($BS_CENTER,$BS_VCENTER,$BS_MULTILINE)) GUICtrlSetOnEvent(-1, "CheckSubFormField") GUICtrlSetFont(-1, 10, 400, 0, "Arial") $sbSubFormStatusBar = _GUICtrlStatusBar_Create($frmSubForm) _GUICtrlStatusBar_SetSimple($sbSubFormStatusBar) _GUICtrlStatusBar_SetText($sbSubFormStatusBar, "") GUISetState(@SW_SHOW, $frmSubForm) GUISetState(@SW_DISABLE, $frmMainForm) #EndRegion ### END Koda GUI section ### EndFunc Func DeleteSubForm() ; Declared Globally => $frmSubForm GUIDelete($frmSubForm) GUISetState(@SW_ENABLE, $frmMainForm) EndFunc Func WriteToStatusBar($sbStatusBar, $objSB_Icon, $strText) _GUICtrlStatusBar_SetIcon($sbStatusBar, 0, $objSB_Icon) _GUICtrlStatusBar_SetText($sbStatusBar, $strText) ConsoleWrite("Icon Handle: " & $objSB_Icon & @CRLF) EndFunc Func CheckSubFormField() ; Declared Globally => $txtSubFormField If GUICtrlRead($txtSubFormField) = "" Then ; Declared Globally => $sbStatusBar WriteToStatusBar($sbSubFormStatusBar, $objSB_IconError, "Field NOK.") Else WriteToStatusBar($sbSubFormStatusBar, $objSB_IconInformation, "Field OK.") EndIf EndFunc The text is set, but icon is not.
      Could someone please tell me why?
      Thanks everyone in advance  

      Best Regards.
    • Sven-Seyfert
      By Sven-Seyfert
      Hi Community,

      I have a problem with the usage of _GUICtrlTreeView_AddChild and setting different item text colors (and different background colors), separately for the TreeView levels.

      I use the UDF GUITreeViewEx.au3 of 'Melba23' and I renamed the functions to increase my understanding about the content. I already talked to him about his UDF to respect his rights and intellectual property. I read many forum threads, I tried many ways to get it, but it's seems to be impossible in the way that I use the UDF.

      How can I set different item text colors, separately for the TreeView levels?
      How can I set different item background colors, separately for the TreeView levels?

      I found out that _GUICtrlTreeView_AddChild don't let my set this properties directly. But after loading the TreeView content I can't change the items (children) too. Only the font weight to bold I could set with _GUICtrlTreeView_SetBold but I want to do this in a generic way directly at the creation (loading) of the TreeView.

      Of course I tried the different functions to set text color or bkgColor, but it didn't work - maybe I do it wrong.
      I really hope you can help me, give me a hint and understand what I want to do.
      [Solved] final solution made by @LarsJ (see below)

      Thanks for your help - I'm grateful!