Jump to content
BuckMaster

Treeview Icon Problems

Recommended Posts

BuckMaster

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)
$hTree = GUICtrlCreateTreeView( 10, 10, 200, 480, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))
GUISetState()

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

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

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

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
    EndIf
EndFunc

Any help would be appreciated :)

Resources.zip

Share this post


Link to post
Share on other sites
AZJIO

#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)

$hTree = GUICtrlCreateTreeView(10, 10, 200, 480, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS))

GUISetState()



$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

            Exit

        Case $hCreate

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

            _GUICtrlTreeView_Expand($hTree)

    EndSwitch

WEnd



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

EndFunc



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

    EndSwitch

EndFunc

Share this post


Link to post
Share on other sites
BuckMaster

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

BuckMaster

Share this post


Link to post
Share on other sites
DickG

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.")
EndIf

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

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
AutoBert

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

       
      Update:
      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
      Hello,
      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:

      Folder1
      Folder2
      Folder3
      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.
       
      Edit:
      Basically i like to color a file and its belonging tree red if the file exists more than 1 time.
    • xtcislove
      By xtcislove
      Hello,

      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
      GUICtrlCreateTreeViewItem
      instead of 
      _GUICtrlTreeView_AddChild
       
      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?
       
      Solution:

       
       
    • 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.

      Question:
      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!
      Sven

      CODE
      BEFORE
      AFTER
      ExecutionPlan.zip
×