Sign in to follow this  
Followers 0
OldCoder

Windows Explorer inside my form...?

9 posts in this topic

What I'd like to do is create a listview with folders and files of directories, (kind of "FileOpenDialog" meets "FileSelectFolder"), inside a pane in my application and be able to get selected or drag/drop info, etc. I've been using listview to try to simulate the Windows Explorer, but it's too slow for really large directories and, while the icon representations, using cross references to the registry, are good, they aren't 100% accurate.

To me, it seems I am trying to re-invent the wheel. There must be some DLL call or something I can do to create an actual boxed, detail view of Windows Explorer in my app. I've searched fairly extensively through the forum and found some cool stuff, some simulate Explorer, some actually embed applications inside your program...nice. However, none of these seems as elegant or as useful as actually being able to call a DLL or create an Object that was the real deal.

Is there anyone who knows anything about this? Any help you can offer would be appreciated. Thanks.

Cheers

:)


"Intelligence is the ability to adapt to change."                                      - Stephen Hawking                                        "...not the ability to exploit others."                                                  - OldCoder

Share this post


Link to post
Share on other sites



Hey, thanks for the reply, Smoke. Yeah, I've seen this, even mentioned it in my query. It's really nice, but not really what I'm looking for. In my original query I stated what I was trying to do was call a dll or object maybe that could simply show like one of Windows Explorer's SysListView321 panes in detailed view in my application. Have been looking through Microsoft's stuff and C++ but haven't found anything yet, not that I could probably make head nor tails of that stuff anyway.

Any help you guys? Thanks.

Cheers

:)


"Intelligence is the ability to adapt to change."                                      - Stephen Hawking                                        "...not the ability to exploit others."                                                  - OldCoder

Share this post


Link to post
Share on other sites

Hey, thanks for the reply, Smoke. Yeah, I've seen this, even mentioned it in my query. It's really nice, but not really what I'm looking for. In my original query I stated what I was trying to do was call a dll or object maybe that could simply show like one of Windows Explorer's SysListView321 panes in detailed view in my application. Have been looking through Microsoft's stuff and C++ but haven't found anything yet, not that I could probably make head nor tails of that stuff anyway.

Any help you guys? Thanks.

Cheers

:)

Ahh, I see that now... sorry.

Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.

Share this post


Link to post
Share on other sites

Ahh, I see that now... sorry.

Hey, no problemo. I appreciate it mucho. I did like the idea, (http://www.autoitscript.com/forum/index.ph...st&p=428355), and tried to work with it early in this project, but I could not get just the SysListView321 pane or a detailed view from it. It's probably some defect in my programming ability, maybe I should learn C++. Couldn't hurt, right? :)

Again, thanks for your help. I will keep forging on, hopefully someone knows the answer to this puzzle.

Cheers, friend.

;)


"Intelligence is the ability to adapt to change."                                      - Stephen Hawking                                        "...not the ability to exploit others."                                                  - OldCoder

Share this post


Link to post
Share on other sites

*bump :)


"Intelligence is the ability to adapt to change."                                      - Stephen Hawking                                        "...not the ability to exploit others."                                                  - OldCoder

Share this post


Link to post
Share on other sites

I have been trying to simulate this without success. I did create a "drag and drop" syslistview that worked pretty well... but I could not create a simple OpenFileDialog where I could select folders as well as files.

Lar.


f_mrcleansmalm_77ce002.jpgAutoIt has helped make me wealthy

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

I have been trying to simulate this without success. I did create a "drag and drop" syslistview that worked pretty well... but I could not create a simple OpenFileDialog where I could select folders as well as files.

Lar.

Cool, Larry. Yeah, I got the whole simulation thing purdy licked, but it isn't as fast or good as an actual SysListView321 pane from Windows Explorer. I've also tried using the GUIListView.au3 and GUIImageList.au3 commands to create an image list to see if that might speed things up. It may have been a fraction faster, maybe, but I couldn't use negative icon references and most of my icons had a black border around them. Seemed like lots of work with piss pour results. Oh well.

I guess I'll have to stick to simulation. It works, and not too badly, though it would be much easier, better and cleaner to use something like what I started this thread for.

Thanks for your reply.

Cheers

:)

Edited by OldCoder

"Intelligence is the ability to adapt to change."                                      - Stephen Hawking                                        "...not the ability to exploit others."                                                  - OldCoder

Share this post


Link to post
Share on other sites

#9 ·  Posted (edited)

I have been trying to simulate this without success. I did create a "drag and drop" syslistview that worked pretty well... but I could not create a simple OpenFileDialog where I could select folders as well as files.

Lar.

By the way, Larry, if you are looking for some structure info for the Windows Explorer sim, I've found this in the past, (http://www.autoitscript.com/forum/index.ph...st&p=105811), though you'd want to use a listview, I think, instead of treeview...that is if you want to multi-select items.

I had to edit the AutoIt3Explorer.au3 listed there, if you want it, here it is:

; ----------------------------------------------------------------------------
;
; AutoIt Version: 3.1.1.73
; Author:         Holger Kotsch
; Version: 1.1
;
; Script Function:
;   Unfinished Explorer-like sample (Preview)
;
; !!! Self-API-created items are not supported !!!
;
; ----------------------------------------------------------------------------

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

; TV functions
Global $TVM_INSERTITEM          = $TV_FIRST + 0
Global $TVM_GETITEMRECT         = $TV_FIRST + 4
Global $TVM_SETIMAGELIST            = $TV_FIRST + 9
Global $TVM_SETITEM             = $TV_FIRST + 13
Global $TVM_HITTEST             = $TV_FIRST + 17

Global $TVI_FIRST                   = 0xFFFF0001

; Masks
Global $TVIF_IMAGE              = 0x0002
Global $TVIF_HANDLE             = 0x0010
Global $TVIF_SELECTEDIMAGE      = 0x0020
Global $TVIF_CHILDREN               = 0x0040

; States
Global $TVIS_CUT                    = 0x0004
Global $TVIS_DROPHILITED            = 0x0008
Global $TVIS_BOLD                   = 0x0010
Global $TVIS_EXPANDED               = 0x0020

; Relationship/specific item
Global $TVGN_ROOT                   = 0x0000
Global $TVGN_PREVIOUS               = 0x0002
Global $TVGN_FIRSTVISIBLE           = 0x0005
Global $TVGN_NEXTVISIBLE            = 0x0006
Global $TVGN_PREVIOUSVISIBLE        = 0x0007
Global $TVGN_DROPHILITE         = 0x0008

; Hittest infos
Global $TVHT_NOWHERE                = 0x0001
Global $TVHT_ONITEMICON         = 0x0002
Global $TVHT_ONITEMLABEL            = 0x0004
Global $TVHT_ONITEMINDENT           = 0x0008
Global $TVHT_ONITEMBUTTON           = 0x0010
Global $TVHT_ONITEMRIGHT            = 0x0020
Global $TVHT_ONITEMSTATEICON        = 0x0040
Global $TVHT_ONITEM             = BitOr($TVHT_ONITEMICON, $TVHT_ONITEMLABEL, $TVHT_ONITEMSTATEICON)
Global $TVHT_ABOVE              = 0x0100
Global $TVHT_BELOW              = 0x0200
Global $TVHT_TORIGHT                = 0x0400
Global $TVHT_TOLEFT             = 0x0800

If Not IsDeclared("LVM_SETEXTENDEDLISTVIEWSTYLE")   Then Global $LVM_SETEXTENDEDLISTVIEWSTYLE   = 0x1036
If Not IsDeclared("LVM_SETCOLUMN")                  Then Global $LVM_SETCOLUMN              = 0x101A
If Not IsDeclared("LVCF_FMT")                       Then Global $LVCF_FMT                       = 0x0001
If Not IsDeclared("LVCFMT_RIGHT")                   Then Global $LVCFMT_RIGHT                   = 0x0001
If Not IsDeclared("LVM_GETHEADER")                  Then Global $LVM_GETHEADER              = 0x101F

Global $nCtrls = 0
Global $hCurItem = 0
Global $hImageList = 0

Global $szDirType = RegRead("HKCR\Directory", "")
If $szDirType = "" Then $szDirType = "Directory"

$hGui = GUICreate("AutoIt3-Explorer V1.1 ;-)", 762, 578, -1, -1, BitOr($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))

$nFileMenu      = GUICtrlCreateMenu("&File")
$editMenu       = GUICtrlCreateMenu("&Edit")
$nViewMenu      = GUICtrlCreateMenu("&View")
$nViewItem1     = GUICtrlCreateMenuItem("Icons", $nViewMenu, -1, 1)
$nViewItem2     = GUICtrlCreateMenuItem("Report", $nViewMenu, -1, 1)
GUICtrlSetState(-1, $GUI_CHECKED)
$nViewItem3     = GUICtrlCreateMenuItem("Small Icons", $nViewMenu, -1, 1)
$nViewItem4     = GUICtrlCreateMenuItem("List", $nViewMenu, -1, 1)
$nExtraMenu     = GUICtrlCreateMenu("E&xtra")
$nHelpMenu      = GUICtrlCreateMenu("&?")
$nExitItem      = GUICtrlCreateMenuItem("Exit",$nFileMenu)
$nAboutItem     = GUICtrlCreateMenuItem("About",$nHelpMenu)

GUICtrlCreateLabel("", 0, 0, 800, 2, BitOr($SS_SUNKEN, $SS_BLACKRECT))
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)

GUICtrlCreateLabel("Address", 5, 5, 50, 20)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)

$nAddressbar    = GUICtrlCreateCombo("C:\", 50, 3, 600, 20)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)

$arDrives       = DriveGetDrive("ALL")

$nTreeView      = GUICtrlCreateTreeView(0, 25, 310, 513, -1, $WS_EX_CLIENTEDGE)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH)
GUICtrlSetState(-1, $GUI_FOCUS)
GUICtrlSetImage(-1, "shell32.dll", 3, 4)    ;
GUICtrlSetImage(-1, "shell32.dll", 4, 2)    ;
GUICtrlSetImage(-1, "shell32.dll", 7)       ; Removable
GUICtrlSetImage(-1, "shell32.dll", 8)       ; Fixed
GUICtrlSetImage(-1, "shell32.dll", 9)       ; Network
GUICtrlSetImage(-1, "shell32.dll", 11)      ; CD-ROM

$nListView      = GUICtrlCreateListView("Name|Size|Type|Changed",314, 25, 447, 513)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM)
GUICtrlSendMsg(-1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
GUICtrlListViewSetColumnFormat($nListView, 1, $LVCFMT_RIGHT)
GUICtrlSetImage(-1, "shell32.dll", 0)

$statusbarobj   = GUICtrlCreateLabel(" Object(s)",0, 540, 150, 18, $SS_SUNKEN)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
$statusbarsize  = GUICtrlCreateLabel(" MB (Free Space: 0 MB)", 152, 540, 610, 18, $SS_SUNKEN)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)

$nSplitter      = GUICtrlCreateLabel("", 310, 29, 4, 509)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH)
GUICtrlSetCursor(-1, 13)

GUISetState()

FillTreeRoot($arDrives)
UpdateWindow($nTreeView)

$nFirstItem = 0
$nLastItem  = 0
$nOldItem   = 0

DirToList("C:")
$szCurrentPath = "C:"
$szOldPath = ""

$curx = 0
$curpressed = 0
$splitx1 = 48
$splitx2 = 52
$savex = 310
$pressed = 0

While 1
    $nMsg = GUIGetMsg()
    $arInfo = GUIGetCursorInfo()
    If $pressed = 1 And $arInfo[2] = 0 Then $pressed = 0
    If $pressed = 1 And $arInfo[2] = 1 Then
        $arPos = WinGetPos($hGui)
        If $arInfo[0] > 100 And $arInfo[0] < $arPos[2] - 100 Then
            If $arInfo[0] <> $savex Then
                ControlMove($hGui, "", $nSplitter, $arInfo[0] - 2, 29)
                ControlMove($hGui, "", $nTreeView, 0, 25, $arInfo[0] - 2)
                ControlMove($hGui, "", $nListView, $arInfo[0] + 2, 25, $arPos[2] - $arInfo[0] - 10)
                $savex = $arInfo[0]
            EndIf
        EndIf
    EndIf
    
    If IsArray($arInfo) AND $arInfo[4] = $nTreeView And $arInfo[2] And WinActive($hGui) Then
        $nFlag = 0
        $hItem = TV_Hittest($nTreeView, $nFlag)
                
        If BitAnd($nFlag, $TVHT_ONITEMBUTTON) Or BitAnd($nFlag, $TVHT_ONITEM) Then
            GUISetState(@SW_LOCK)
            CheckTreeFill($nTreeView, $hItem)
            GUISetState(@SW_UNLOCK)
            GUICtrlSetData($nAddressbar, GetTreePath($nTreeView, $hItem, "\"))
        EndIf
        $hItem = GUICtrlSendMsg($nTreeView, $TVM_GETNEXTITEM, $TVGN_CARET, 0)
        $szCurrentPath = GetTreePath($nTreeView, $hItem, "\")
        
        If BitAnd($nFlag, $TVHT_ONITEM) Then GUICtrlSetData($nAddressbar, $szCurrentPath)
        
        If $szOldPath <> $szCurrentPath Then
            $szOldPath = $szCurrentPath
            GUISetState(@SW_LOCK)
            For $i = $nFirstItem To $nLastItem
                GUICtrlDelete($i)
            Next
            GUISetState(@SW_UNLOCK)
            ;UpdateCtrl($hGui, $nListView)
            $nFirstItem = 0
            $nLastItem  = 0
            $nOldItem   = 0
            GUICtrlSetData($nAddressbar, $szCurrentPath)
            GUICtrlSetCursor($nListView,1)
            GUICtrlSetCursor($nTreeView,1)
            DirToList($szCurrentPath)
            GUICtrlSetCursor($nListView,2)
            GUICtrlSetCursor($nTreeView,2)
        EndIf
    ElseIf _IsPressed("6B") And ControlGetFocus($hGui) = "SysTreeView321" Then
        $hItem = GUICtrlSendMsg($nTreeView, $TVM_GETNEXTITEM, $TVGN_CARET, 0)
        CheckTreeFill($nTreeView, $hItem)
    EndIf
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $nExitItem
            ExitLoop
        
        Case $nAboutItem
            Msgbox(64,"About","Demo by Holger")
            
        Case $nSplitter
            $cinfo = GUIGetCursorInfo()
            If $cinfo[2] = 1 Then $pressed = 1
            
        Case $nViewItem1 To $nViewItem4
            GUICtrlSetStyle($nListView, BitOr($LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $nMsg - $nViewItem1))
    EndSwitch
WEnd

Exit


Func CheckTreeFill($nCtrl, $hItem)
    If $hItem > 0 Then
        $hChild = GUICtrlSendMsg($nTreeView, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        If $hChild > 0 Then
            $szText = GetItemText($nTreeView, $hChild)
            If $szText = "" Then
                $szPath = GetTreePath($nTreeView, $hItem, "\")
                If StringRight($szPath, 1) = "\" Then $szPath = StringTrimRight($szPath, 1)
                GUICtrlSetCursor($nTreeView, 1)
                FillTree($szPath, $hItem, $hChild)
                GUICtrlSetCursor($nTreeView, 2)
            EndIF
        EndIf
    EndIf
EndFunc


Func FillTreeRoot($arDrives)
    Local $hSearch, $szFile, $nChildren, $szDriveLabel
    
    $hParent = 0
    For $i = 1 To $arDrives[0]
        $nChildren = 0
        If GetSubFolder($arDrives[$i]) Then $nChildren = 1
        $szType = DriveGetType($arDrives[$i])
        Switch $szType
            Case "Removable"
                $iImage = 2
                $iSelectedImage = 2
            Case "Fixed"
                $iImage = 3
                $iSelectedImage = 3
            Case "Network"
                $iImage = 4
                $iSelectedImage = 4
            Case "CDROM"
                $iImage = 5
                $iSelectedImage = 5
            Case Else
                $iImage = 0
                $iSelectedImage = 0
        EndSwitch
        
        If $szType = "Removable" Then
            $szText = "Removable"
        ElseIf $szType = "Network" Then
            $szLabel = DriveMapGet($arDrives[$i])
            $nPos = StringInStr($szLabel, "\", 0, -1)
            $szText = StringRight($szLabel, StringLen($szLabel) - $nPos) & " on """ & StringTrimLeft(StringLeft($szLabel, $nPos - 1), 2) & """"
             
        Else
            $szText = DriveGetLabel($arDrives[$i])
        EndIf
        $szDriveLabel =  $szText & " (" & StringUpper($arDrives[$i]) & ")"
        $hItem = InsertItem($szDriveLabel, $hParent, $hCurItem, $nChildren, $iImage, $iSelectedImage)
        If $nChildren = 1 Then InsertDummyItem($nTreeView, $hItem)
    Next
    $hItem = GUICtrlSendMsg($nTreeView, $TVM_GETNEXTITEM, $TVGN_ROOT, 0)
    GUICtrlSendMsg($nTreeView, $TVM_SELECTITEM, $TVGN_CARET, $hItem)

EndFunc


Func FillTree($szPath, $hParent = 0, $hDelete = 0)
    Local $hSearch, $szFile, $nChildren
    
    If $hDelete > 0 Then
        GUICtrlSendMsg($nTreeView, $TVM_DELETEITEM, 0, $hDelete)
        SetItemChildren($hParent)
    EndIf
    
    $hSearch = FileFindFirstFile($szPath & "\*.*")  
    If $hSearch = -1 Then Return

    While 1
        $szFile = FileFindNextFile($hSearch) 
        If @error Then ExitLoop
        If StringInStr(FileGetAttrib($szPath & "\" & $szFile), "D") Then
            $nChildren = 0
            If GetSubFolder($szPath & "\" & $szFile) Then $nChildren = 1
            
            $hItem = InsertItem($szFile, $hParent, $hCurItem, $nChildren)
            If $nChildren = 1 Then InsertDummyItem($nTreeView, $hItem)
            $nCtrls = $nCtrls + 1
        EndIf
    WEnd
    FileClose($hSearch)
EndFunc


Func GetSubFolder($szPath)
    Local $hSearch, $szFile, $nChildren = 0
    
    $hSearch = FileFindFirstFile($szPath & "\*.*")  
    If $hSearch = -1 Then Return

    While 1
        $szFile = FileFindNextFile($hSearch) 
        If @error Then ExitLoop
        If StringInStr(FileGetAttrib($szPath & "\" & $szFile), "D") Then
            $nChildren = 1
            ExitLoop
        EndIf       
    WEnd
    FileClose($hSearch)
    
    Return $nChildren
EndFunc


Func InsertItem($szText, $hParent, $hInsertAfter, $nChildren, $iImage = 0, $iSelectedImage = 1)

    $pszText = DllStructCreate("char[260]")
    DllStructSetData($pszText, 1, $szText)
    
    $tvItem = TVITEM()
    $tvInsertStruct = DllStructCreate("int;int;int[10]")

    If $hCurItem = 0 Then
        $hInsertAfter = $TVI_FIRST
    Else
        $hInsertAfter = $hCurItem
    EndIf
    DllStructSetData($tvInsertStruct, 1, $hParent)
    DllStructSetData($tvInsertStruct, 2, $hInsertAfter)
    DllStructSetData($tvInsertStruct, 3, $tvItem)
    
    $hItem = GUICtrlSendMsg($nTreeView, $TVM_INSERTITEM, 0, DllStructGetPtr($tvInsertStruct))
    If $hItem > 0 Then
        $hCurItem = $hItem
        
        DllStructSetData($tvItem, 1, BitOr($TVIF_TEXT, $TVIF_IMAGE, $TVIF_SELECTEDIMAGE))
        DllStructSetData($tvItem, 2, $hItem)
        DllStructSetData($tvItem, 5, DllStructGetPtr($pszText))
        DllStructSetData($tvItem, 7, $iImage)
        DllStructSetData($tvItem, 8, $iSelectedImage)
        GUICtrlSendMsg($nTreeView, $TVM_SETITEM, 0, DllStructGetPtr($tvItem))
    EndIf
    $tvInsertStruct=""
    $tvItem=""
    $pszText=""
;   DllStructDelete($tvInsertStruct)
;   DllStructDelete($tvItem)
;   DllStructDelete($pszText)
    
    Return $hItem
EndFunc


Func InsertDummyItem($nCtrl, $hItem)
    InsertItem("", $hItem, $hCurItem, 0)
EndFunc


Func TV_Hittest($nCtrl, ByRef $nFlag)

    $hItem  = 0
    $point = DllStructCreate("int;int")
    DllCall("user32.dll", "int", "GetCursorPos", "ptr", DllStructGetPtr($point))
    
    $hWnd = ControlGetHandle("", "", $nCtrl)
    DllCall("user32.dll", "int", "ScreenToClient", "hwnd", $hWnd, "ptr", DllStructGetPtr($point))
    
    $tvHit = DllStructCreate("int[2];uint;int")
    DllStructSetData($tvHit, 1, DllStructGetData($point, 1), 1)
    DllStructSetData($tvHit, 1, DllStructGetData($point, 2), 2)
    
    If GUICtrlSendMsg($nCtrl, $TVM_HITTEST, 0, DllStructGetPtr($tvHit)) Then
        $nFlag = DllStructGetData($tvHit, 2)
        $hItem = DllStructGetData($tvHit, 3)
    EndIf
    $tvHit=""
    $point=""
;   DllStructDelete($tvHit)
;   DllStructDelete($point)
    
    Return $hItem       
EndFunc


Func ItemHasChildren($nCtrl, $hItem)
    $nChildren = 0
    If GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem) > 0 Then $nChildren = 1
    Return $nChildren
EndFunc


Func ExpandTree($nCtrl, $hItem)
    $result = GUICtrlSendMsg($nCtrl, $TVM_EXPAND, 0x0002, $hItem)
EndFunc


Func GetTreePath($nCtrl, $hItem, $szSepChar)
    Local $szPath = "", $hParent, $hWnd, $szText
   
    While $hItem > 0
        $szText = GetItemText($nCtrl, $hItem)
        $hParent = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
        If $hParent = 0 Then $szText = StringRight(StringTrimRight($szText, 1), 2)
        $szPath = $szText & $szSepChar & $szPath
        $hItem = $hParent
    WEnd
    
    Return $szPath
EndFunc


Func GetItemText($nCtrl, $hItem)
    Local $szText = "", $pszText, $tvItem
    
    $pszText = DllStructCreate("char[260]")

    $tvItem = TVITEM()
       
    DllStructSetData($tvItem, 1, $TVIF_TEXT)
    DllStructSetData($tvItem, 2, $hItem)
    DllStructSetData($tvItem, 5, DllStructGetPtr($pszText))
    DllStructSetData($tvItem, 6, 260)

    GUICtrlSendMsg($nTreeView, $TVM_GETITEM, 0, DllStructGetPtr($tvItem))
    $szText = DllStructGetData($pszText, 1)

    $tvItem=""
    $pszText=""
;   DllStructDelete($tvItem)
;   DllStructDelete($pszText)
   
    Return $szText
EndFunc 


Func GetItemState($nCtrl, $hItem)
    Local $nState = 0, $tvItem
    
    $tvItem = TVITEM()
       
    DllStructSetData($tvItem, 1, $TVIF_STATE)
    DllStructSetData($tvItem, 2, $hItem)
    DllStructSetData($tvItem, 4, $TVIS_STATEIMAGEMASK)

    GUICtrlSendMsg($nTreeView, $TVM_GETITEM, 0, DllStructGetPtr($tvItem))
    $nState = DllStructGetData($tvItem, 3)

    $tvItem=""
;   DllStructDelete($tvItem)
   
    Return $nState
EndFunc


Func TVITEM()
    Return DllStructCreate("uint;int;uint;uint;ptr;int;int;int;int;int")
EndFunc


Func UpdateWindow($nCtrl)
    $hWnd = ControlGetHandle("", "", $nCtrl)
    $rect = DllStructCreate("int;int;int;int")
    DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "int", 0, "int", 0)

EndFunc


Func SetItemChildren($hItem, $nFlag = 1)
    Local $tvItem
    
    $tvItem = TVITEM()
       
    DllStructSetData($tvItem, 1, $TVIF_CHILDREN)
    DllStructSetData($tvItem, 2, $hItem)
    DllStructSetData($tvItem, 9, $nFlag)

    GUICtrlSendMsg($nTreeView, $TVM_SETITEM, 0, DllStructGetPtr($tvItem))

    $tvItem=""
;   DllStructDelete ($tvItem)

EndFunc


Func FileGetIconCount($szFile)
    Dim $szFile, $nCount = 0

    $LPCTSTR = DllStructCreate("char[260]")
    DllStructSetData($LPCTSTR, 1, $szFile)
    $nCount = DllCall("shell32.dll", "int", "ExtractIconEx", "ptr", DllStructGetPtr($LPCTSTR), "int", -1, "int", 0, "int", 0, "int", 0)
    $nCount = $nCount[0]
    $LPCTSTR=""
;   DllStructDelete($LPCTSTR)

    Return $nCount
EndFunc


Func DirToList($szPath)
    Dim $hSearch, $szFile, $szDate, $szType, $nItem
    
    If StringRight($szPath, 1) = "\" Then $szPath = StringTrimRight($szPath, 1)
    $hSearch = FileFindFirstFile($szPath & "\*.*")
    If $hSearch <> -1 Then
        $nItem = -1
        While 1
            $szFile = FileFindNextFile($hSearch)
            If @error Then ExitLoop
            $nIcon = 0
            $szIconFile = $szPath & "\" & $szFile
            FileGetIcon($szIconFile, $nIcon, $szFile)
            $IsDir = StringInStr(FileGetAttrib($szPath & "\" & $szFile),"D")
            $szSize = ""
            If $IsDir Then
                $szType = $szDirType
            Else
                $szSize = Round(FileGetSize($szPath & "\" & $szFile) / 1000) & " KB"
                $szType = FileGetType($szFile)
            EndIf
            $arDate = FileGetTime($szPath & "\" & $szFile)
            If IsArray($arDate) Then $szDate = $arDate[2] & "." & $arDate[1] & "." & $arDate[0] & " " & $arDate[3] & ":" & $arDate[4]
            $nItem = GUICtrlCreateListViewItem($szFile & "|" & $szSize & "|" & $szType & "|" & $szDate, $nListView)
            If $IsDir Then
                GUICtrlSetImage(-1,$szIconFile, 3)
            Else
                GUICtrlSetImage(-1,$szIconFile,$nIcon)
            EndIf
            If $nFirstItem = 0 Then $nFirstItem = $nItem
        WEnd
        FileClose($hSearch)
        $nLastItem = $nItem
        If $nLastItem > 0 Then
            GUICtrlSetData($statusbarobj, $nLastItem - $nFirstItem & " Objects")
        Else
            GUICtrlSetData($statusbarobj, "Ready")
        EndIf
    EndIf
EndFunc


Func FileGetType($szFile)
    Dim $szFile, $szRegDefault = "", $szRegType = ""
    
    $szExt = StringRight($szFile,4)
    $szRegDefault = RegRead("HKCR\" & $szExt,"")
    If $szRegDefault <> "" Then $szRegType = RegRead("HKCR\" & $szRegDefault,"")
    If $szRegType = "" Then $szRegType = $szExt & "-File"
    
    Return $szRegType
EndFunc


Func FileGetIcon(ByRef $szIconFile, ByRef $nIcon, $szFile)
    Dim $szFile, $szRegDefault = "", $szDefIcon = ""
    
    $nIcon = 0
    $szExt = StringRight($szFile,4)
    $szRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $szExt,"ProgID")
    If $szRegDefault = "" Then $szRegDefault = RegRead("HKCR\" & $szExt,"")
    If $szRegDefault <> "" Then $szDefIcon = RegRead("HKCR\" & $szRegDefault & "\DefaultIcon","")
    If $szDefIcon = "" Then
        $szIconFile = "shell32.dll"
    ElseIf $szDefIcon <> "%1" Then
        $arSplit = StringSplit($szDefIcon,",")
        If IsArray($arSplit) Then
            $szIconFile = $arSplit[1]
            If $arSplit[0] > 1 Then $nIcon = $arSplit[2]
        Else
            Return 0
        EndIf
    EndIf
    Return 1
EndFunc


Func GUICtrlListViewSetColumnFormat($hListView, $nCol, $nFormat)
    $hListViewHeader = GUICtrlSendMsg($hListView, $LVM_GETHEADER, 0, 0)
    
    $LVCOLUMN = DllStructCreate("uint;int;int;ptr;int;int;int;int")
    DllStructSetData($LVCOLUMN, 1, $LVCF_FMT)
    DllStructSetData($LVCOLUMN, 2, $nFormat)
    GUICtrlSendMsg($hListView, $LVM_SETCOLUMN, $nCol, DllStructGetPtr($LVCOLUMN))
    $LVCOLUMN=""
;   DllStructDelete($LVCOLUMN)
EndFunc


Func UpdateCtrl($hWnd, $nCtrl)
    $hCtrl = ControlGetHandle($hWnd, "", $nCtrl)
    
    $point  = DllStructCreate("int;int")
    $rect   = DllStructCreate("int;int;int;int")
    
    DllCall("user32.dll", "int", "GetWindowRect", "hwnd", $hCtrl, "ptr", DllStructGetPtr($rect))
    DllStructSetData($point, 1, DllStructGetData($rect, 1))
    DllStructSetData($point, 2, DllStructGetData($rect, 2))
    DllCall("user32.dll", "int", "ScreenToClient", "hwnd", $hCtrl, "ptr", DllStructGetPtr($point))
    DllStructSetData($rect, 1, DllStructGetData($point, 1))
    DllStructSetData($rect, 2, DllStructGetData($point, 2))
    
    DllStructSetData($point, 1, DllStructGetData($rect, 3))
    DllStructSetData($point, 2, DllStructGetData($rect, 4))
    DllCall("user32.dll", "int", "ScreenToClient", "hwnd", $hCtrl, "ptr", DllStructGetPtr($point))
    DllStructSetData($rect, 3, DllStructGetData($point, 1))
    DllStructSetData($rect, 4, DllStructGetData($point, 2))

    DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "ptr", DllStructGetPtr($rect), "int", 1);
    $point=""
    $rect=""
;   DllStructDelete($point)
;   DllStructDelete($rect)
EndFunc

Hope this helps.

Cheers

B)

Edited by OldCoder

"Intelligence is the ability to adapt to change."                                      - Stephen Hawking                                        "...not the ability to exploit others."                                                  - OldCoder

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
Sign in to follow this  
Followers 0