Jump to content
Sign in to follow this  
rootx

[SOLVED] ListView update image help

Recommended Posts

rootx

This script creates a list of images and their description, you can also rotate images and save them in the right quality.

I would like to update the image in the Listview, when it is rotated by Gui2.
I tried to find a good solution, but without success. Could someone help me, thanks.:)

#include <APIResConstants.au3>
#include <GuiTab.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <GDIPlus.au3>

 Global $hGUI2 = 1111,$hGUI1, $hButton3 ,$hButton1,$hButton2,$hButton3,$flip,$image2

_imagelist()

Func _imagelist()

    Global $inimg = @ScriptDir&"\img.ini"

    Global $idListview, $hImage

    Local $aArray2 = _FileListToArrayRec(@ScriptDir, "*.jpg", $FLTAR_FILES, 1, $FLTAR_SORT,$FLTAR_FULLPATH)
    $fileArray4 = UBound($aArray2) -1
    If $fileArray4 > 0 Then
    $hGUI1 = GUICreate("Image Album List "&$fileArray4, 800, 600)
    $idListview = GUICtrlCreateListView("", 2, 2, 800, 600, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER))

    ; block resizing of columns
    ControlDisable($hGUI1, "", HWnd(_GUICtrlListView_GetHeader($idListview)))

    GUISetState()
    ; Load images
    $hImage = _GUIImageList_Create(64, 64,5,3)
    _GUICtrlListView_SetImageList($idListview, $hImage)
    ; Add columns
    _GUICtrlListView_AddColumn($idListview, "Image", 64)
    _GUICtrlListView_AddColumn($idListview, "Path", 350)
    _GUICtrlListView_AddColumn($idListview, "Caption",365)
    ;_GUICtrlListView_HideColumn($idListview, 1)
    _GDIPlus_Startup()
    Local $GDIpBmpLarge,$GDIpBmpResized,$GDIbmp

    For $y = 1 To $fileArray4
        $ini = IniWrite($inimg,$aArray2[$y],"caption",$aArray2[$y]) ;<<< run only the first time, then put a comment
        $GDIpBmpLarge = _GDIPlus_ImageLoadFromFile($aArray2[$y]) ;GDI+ image!
        $GDIpBmpResized = _GDIPlus_ImageResize($GDIpBmpLarge, 64,64) ;GDI+ imagez
        $GDIbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResized) ;GDI image!
        $img = _GUIImageList_Add($hImage, $GDIbmp)
        _GUICtrlListView_SetImageList($idListview, $hImage, 1)

        ;Add items
        _GUICtrlListView_AddItem($idListview, "", $img) ;load image inside listview
        _GUICtrlListView_AddSubItem($idListview, $y-1,$aArray2[$y],1)
        _GUICtrlListView_AddSubItem($idListview, $y-1,IniRead($inimg,$aArray2[$y],"caption",""),2) ;load caption inside listview
        ;Clean
        _GDIPlus_BitmapDispose($GDIpBmpLarge) ;release GDI+ image!
        _GDIPlus_BitmapDispose($GDIpBmpResized);release GDI+ image!
        _WinAPI_DeleteObject($GDIbmp);release Obj!
    Next

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

     While 1
         $aMsg = GUIGetMsg(1)
         Switch $aMsg[1]
             Case $hGUI1
                 Switch $aMsg[0]
                     Case $GUI_EVENT_CLOSE
                         ExitLoop
                         GUIDelete($hGUI1)
                 EndSwitch
             Case $hGUI2
                 Switch $aMsg[0]
                     Case $GUI_EVENT_CLOSE
                         GUIDelete($hGUI2)
                         GUICtrlSetState ($idListview,$GUI_ENABLE)
                     Case $hButton1
                         $flip = 1
                         rotate($image2,$flip)
                     Case $hButton2
                         $flip = 4
                         rotate($image2,$flip)
                     Case $hButton3
                         $flip = 6
                         rotate($image2,$flip)
                 EndSwitch
         EndSwitch
     WEnd

    ;cleanup resources
    _GDIPlus_Shutdown()
    Else
        MsgBox("","","Images folder are empty")
    EndIf
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $hWndListView = $idListview
    If Not IsHWnd($idListview) Then $hWndListView = GUICtrlGetHandle($idListview)

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $path = IniRead("cfg.ini","PAGE","sourcedir","")
                     Local $iItemText = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),2)
                     Local $sValue = InputBox("Edit Image", "Enter your description.", ""," M100",400,150)
                     Local $iIndex = _GUICtrlListView_GetSelectedIndices($idListview)
                     _GUICtrlListView_SetItemText($idListview,$iIndex,$sValue,2)
                      If $sValue <> "" Then
                         IniWrite($inimg,_GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1),"caption",$sValue)
                      Else
                          _GUICtrlListView_SetItemText($idListview,$iIndex,$iItemText,3)
                      EndIf

                Case $LVN_COLUMNCLICK ; A column was clicked
                    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)

                    _GUICtrlListView_SortItems($idListview, _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1))

                Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $image2 = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1)
                    Global $colrbt = 0xFF0CAA, $colortxbt = 0xFFFFFF
                    $hGUI2 = GUICreate($image2, 800, 650, -1, -1);create a test gui to display the image
                    $hButton1 = GUICtrlCreateButton("Rotate", 10, 610, 120, 30)
                    GUICtrlSetBkColor(-1, $colrbt)
                    GUICtrlSetColor(-1,$colortxbt)
                    $hButton2 = GUICtrlCreateButton("Flip Horizontally", 140, 610, 120, 30)
                    GUICtrlSetBkColor(-1, $colrbt)
                    GUICtrlSetColor(-1,$colortxbt)
                    $hButton3 = GUICtrlCreateButton("Flip Vertically", 270, 610, 120, 30)
                    GUICtrlSetBkColor(-1, $colrbt)
                    GUICtrlSetColor(-1,$colortxbt)
                    GUISetState(@SW_SHOW)
                    rotate($image2,0)
                    GUICtrlSetState ($idListview,$GUI_DISABLE)

                    Return 0 ; allow the default processing
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func rotate($image2,$flip)
    _GDIPlus_Startup()
    Local $hImagex, $tData, $tParams
    $hImagex = _GDIPlus_ImageLoadFromFile($image2)
    $imgX = _GDIPlus_ImageGetWidth($hImagex)
    $imgY = _GDIPlus_ImageGetHeight($hImagex)
    $himage_Clone = _GDIPlus_BitmapCloneArea($hImagex, 0, 0, $imgX, $imgY,$GDIP_PXF24RGB)
    _GDIPlus_ImageDispose($hImagex)
    _GDIPlus_ImageRotateFlip($himage_Clone,$flip)
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI2) ;create a graphics object from a window handle
    $hImage_new2 = _GDIPlus_ImageResize($himage_Clone, 800,600)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hImage_new2, 0, 0) ;display rotated image

    ;Change image quality
    $clsid = _GDIPlus_EncodersGetCLSID("JPG");type
    $tParams = _GDIPlus_ParamInit(1)
    $tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", 100) ;quality 0-100
    $pData = DllStructGetPtr($tData)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
    $pParams = DllStructGetPtr($tParams)

    ;Save the new resized image.
    _GDIPlus_ImageSaveToFileEx($himage_Clone, $image2, $clsid, $pParams)

    ;clean
    _GDIPlus_ImageDispose($himage_Clone)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_ImageDispose($hImage_new2)
    _GDIPlus_Shutdown()
EndFunc

 

Edited by rootx

Share this post


Link to post
Share on other sites
UEZ

Use 

_GUIImageList_Replace

function to replace the image in the image list. The image must be in GDI format!

Btw, I don't know why this function is not in the help file although it is in GuiImageList.au3...

; #NO_DOC_FUNCTION# =============================================================================================================
; Name...........: _GUIImageList_Replace
; Description ...: Replaces an image with an icon or cursor
; Syntax.........: _GUIImageList_ReplaceIcon ( $hWnd, $iIndex, $hIcon )
; Parameters ....: $hWnd        - Handle to the control
;                  $iIndex      - Index of the image to replace.
;                  $hImage      - Handle to the bitmap that contains the image
;                  $hMask       - A handle to the bitmap that contains the mask.
;                  +If no mask is used with the image list, this parameter is ignored
; Return values .: Success      - True
;                  Failure      - False
; Author ........: Gary Frost (gafrost)
; Modified.......:
; Remarks .......: The _GUIImageList_Replace function copies the bitmap to an internal data structure.
;                  Be sure to use the _WinAPI_DeleteObject function to delete $hImage and $hMask after the function returns.
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _GUIImageList_Replace($hWnd, $iIndex, $hImage, $hMask = 0)
    Local $aResult = DllCall("comctl32.dll", "bool", "ImageList_Replace", "handle", $hWnd, "int", $iIndex, "handle", $hImage, "handle", $hMask)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] <> 0
EndFunc   ;==>_GUIImageList_Replace

 

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
rootx

 

Thx UEZ, it should work... but obviously I'm doing something wrong :o

please look here ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test

 

#include <APIResConstants.au3>
#include <GuiTab.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <GDIPlus.au3>

 Global $hGUI2 = 1111,$hGUI1, $hButton3 ,$hButton1,$hButton2,$hButton3,$flip,$image2

_imagelist()

Func _imagelist()

    Global $inimg = @ScriptDir&"\img.ini"

    Global $idListview, $hImage

    Local $aArray2 = _FileListToArrayRec("C:\Users\rootx10\Desktop\x", "*.jpg", $FLTAR_FILES, 1, $FLTAR_SORT,$FLTAR_FULLPATH)
    $fileArray4 = UBound($aArray2) -1
    If $fileArray4 > 0 Then
    $hGUI1 = GUICreate("Image Album List "&$fileArray4, 800, 600)
    $idListview = GUICtrlCreateListView("", 2, 2, 800, 600, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER))

    ; block resizing of columns
    ControlDisable($hGUI1, "", HWnd(_GUICtrlListView_GetHeader($idListview)))

    GUISetState()
    ; Load images
    $hImage = _GUIImageList_Create(64, 64,5,3)
    _GUICtrlListView_SetImageList($idListview, $hImage)
    ; Add columns
    _GUICtrlListView_AddColumn($idListview, "Image", 64)
    _GUICtrlListView_AddColumn($idListview, "Path", 350)
    _GUICtrlListView_AddColumn($idListview, "Caption",365)
    ;_GUICtrlListView_HideColumn($idListview, 1)
    _GDIPlus_Startup()
    Local $GDIpBmpLarge,$GDIpBmpResized,$GDIbmp

    For $y = 1 To $fileArray4
        $ini = IniWrite($inimg,$aArray2[$y],"caption",$aArray2[$y]) ;<<< run only the first time, then put a comment
        $GDIpBmpLarge = _GDIPlus_ImageLoadFromFile($aArray2[$y]) ;GDI+ image!
        $GDIpBmpResized = _GDIPlus_ImageResize($GDIpBmpLarge, 64,64) ;GDI+ imagez
        $GDIbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResized) ;GDI image!
        $img = _GUIImageList_Add($hImage, $GDIbmp)
        _GUICtrlListView_SetImageList($idListview, $hImage, 1)

        ;Add items
        _GUICtrlListView_AddItem($idListview, "", $img) ;load image inside listview
        _GUICtrlListView_AddSubItem($idListview, $y-1,$aArray2[$y],1)
        _GUICtrlListView_AddSubItem($idListview, $y-1,IniRead($inimg,$aArray2[$y],"caption",""),2) ;load caption inside listview
        ;Clean
        _GDIPlus_BitmapDispose($GDIpBmpLarge) ;release GDI+ image!
        _GDIPlus_BitmapDispose($GDIpBmpResized);release GDI+ image!
        _WinAPI_DeleteObject($GDIbmp);release Obj!
    Next

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

     While 1
         $aMsg = GUIGetMsg(1)
         Switch $aMsg[1]
             Case $hGUI1
                 Switch $aMsg[0]
                     Case $GUI_EVENT_CLOSE
                         ExitLoop
                         GUIDelete($hGUI1)
                 EndSwitch
             Case $hGUI2
                 Switch $aMsg[0]
                     Case $GUI_EVENT_CLOSE
                         GUIDelete($hGUI2)
                         GUICtrlSetState ($idListview,$GUI_ENABLE)
                     Case $hButton1
                         $flip = 1
                         rotate($image2,$flip)
                     Case $hButton2
                         $flip = 4
                         rotate($image2,$flip)
                     Case $hButton3
                         $flip = 6
                         rotate($image2,$flip)
                 EndSwitch
         EndSwitch
     WEnd

    ;cleanup resources
    _GDIPlus_Shutdown()
    Else
        MsgBox("","","Images folder are empty")
    EndIf
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $hWndListView = $idListview
    If Not IsHWnd($idListview) Then $hWndListView = GUICtrlGetHandle($idListview)

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $path = IniRead("cfg.ini","PAGE","sourcedir","")
                     Local $iItemText = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),2)
                     Local $sValue = InputBox("Edit Image", "Enter your description.", ""," M100",400,150)
                     Local $iIndex = _GUICtrlListView_GetSelectedIndices($idListview)
                     _GUICtrlListView_SetItemText($idListview,$iIndex,$sValue,2)
                      If $sValue <> "" Then
                         IniWrite($inimg,_GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1),"caption",$sValue)
                      Else
                          _GUICtrlListView_SetItemText($idListview,$iIndex,$iItemText,3)
                      EndIf

                Case $LVN_COLUMNCLICK ; A column was clicked
                    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)

                    _GUICtrlListView_SortItems($idListview, _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1))

                Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $image2 = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"),1)
                    Global $colrbt = 0xFF0CAA, $colortxbt = 0xFFFFFF
                    $hGUI2 = GUICreate($image2, 800, 650, -1, -1);create a test gui to display the image
                    $hButton1 = GUICtrlCreateButton("Rotate", 10, 610, 120, 30)
                    GUICtrlSetBkColor(-1, $colrbt)
                    GUICtrlSetColor(-1,$colortxbt)
                    $hButton2 = GUICtrlCreateButton("Flip Horizontally", 140, 610, 120, 30)
                    GUICtrlSetBkColor(-1, $colrbt)
                    GUICtrlSetColor(-1,$colortxbt)
                    $hButton3 = GUICtrlCreateButton("Flip Vertically", 270, 610, 120, 30)
                    GUICtrlSetBkColor(-1, $colrbt)
                    GUICtrlSetColor(-1,$colortxbt)
                    GUISetState(@SW_SHOW)
                    rotate($image2,0)
                    GUICtrlSetState ($idListview,$GUI_DISABLE)
                    Return 0 ; allow the default processing
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func rotate($image2,$flip)
    _GDIPlus_Startup()
    Local $hImagex, $tData, $tParams
    $hImagex = _GDIPlus_ImageLoadFromFile($image2)
    $imgX = _GDIPlus_ImageGetWidth($hImagex)
    $imgY = _GDIPlus_ImageGetHeight($hImagex)
    $himage_Clone = _GDIPlus_BitmapCloneArea($hImagex, 0, 0, $imgX, $imgY,$GDIP_PXF24RGB)
    _GDIPlus_ImageDispose($hImagex)
    _GDIPlus_ImageRotateFlip($himage_Clone,$flip)
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI2) ;create a graphics object from a window handle
    $hImage_new2 = _GDIPlus_ImageResize($himage_Clone, 800,600)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hImage_new2, 0, 0) ;display rotated image

    $tParams = _GDIPlus_ParamInit(1)
    $tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", 100) ;quality 0-100
    $pData = DllStructGetPtr($tData)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)

    ;Save the new resized image.
    _GDIPlus_ImageSaveToFileEx($himage_Clone, $image2, $clsid, $pParams)

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test
    Local $iIndex2 = _GUICtrlListView_GetSelectedIndices($idListview)
    $GDIbmpx = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResizedx) ;GDI image!
    _GUIImageList_ReplaceIcon($idListview, $iIndex2,$GDIbmpx)


    ;clean
    _GDIPlus_ImageDispose($himage_Clone)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_ImageDispose($hImage_new2)
    _GDIPlus_Shutdown()
EndFunc

 

 

Edited by rootx

Share this post


Link to post
Share on other sites
UEZ

Try these lines and it should work:

Local $iIndex2 = _GUICtrlListView_GetSelectedIndices($idListview)
    $GDIpBmpResizedx = _GDIPlus_ImageResize($hImage_new2, 64, 64) ;GDI+ imagez
    $GDIbmpx = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResizedx) ;GDI image!
    _GUIImageList_Replace($hImage, $iIndex2, $GDIbmpx)

 

  • Like 1

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
rootx

THX UEZ, :)

Share this post


Link to post
Share on other sites
kid1519

Hello @rootx and @UEZ

Can i develop your code like my picture attached

is It possible or impossible?
I want rename pictures like list name

1.png

Share this post


Link to post
Share on other sites
rootx

?? You can, try to do it, and then, post your code if you want others to help you.

Share this post


Link to post
Share on other sites
vadivelero
Local $iIndex2 = _GUICtrlListView_GetSelectedIndices($idListview)
    $GDIpBmpResizedx = _GDIPlus_ImageResize($hImage_new2, 64, 64) ;GDI+ imagez
    $GDIbmpx = _GDIPlus_BitmapCreateHBITMAPFromBitmap($GDIpBmpResizedx) ;GDI image!
    _GUIImageList_Replace($hImage, $iIndex2, $GDIbmpx)

try above

Best Collection wallpapers  at  HD Wallpapers. categories of Natural, Vehicle,Paintings and ect wallpapers and images Pictures.

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  

  • Similar Content

    • Broihon
      By Broihon
      Hey guys,

      I ran into a problem when I wanted to delete items of a listview using the delete key. My approach is to register my own WndProc for the listview and then filter the $WM_GETDLGCODE msg and then call the original WndProc.
      That works like a charm. The problem is that when the listview gets redrawn it somehow ends up in an infinite loop. The listview is suddenly emtpy and I can't interact with any controls of the GUI at all. Here's the code:
       
      #include <GUIConstantsEx.au3> #include <GUIListView.au3> #include <WinAPI.au3> $h_GUI = GUICreate("Test", 200, 200, 350, 350) $h_LV = GUICtrlCreateListView("Col 1|Col 2|Col 3", 0, 0, 200, 200) _GUICtrlListView_AddItem($h_LV, "") _GUICtrlListView_AddSubItem($h_LV, 0, "bla0", 0) _GUICtrlListView_AddSubItem($h_LV, 0, "bla0", 1) _GUICtrlListView_AddSubItem($h_LV, 0, "bla0", 2) _GUICtrlListView_AddItem($h_LV, "") _GUICtrlListView_AddSubItem($h_LV, 1, "bla1", 0) _GUICtrlListView_AddSubItem($h_LV, 1, "bla1", 1) _GUICtrlListView_AddSubItem($h_LV, 1, "bla1", 2) _GUICtrlListView_AddItem($h_LV, "") _GUICtrlListView_AddSubItem($h_LV, 2, "bla2", 0) _GUICtrlListView_AddSubItem($h_LV, 2, "bla2", 1) _GUICtrlListView_AddSubItem($h_LV, 2, "bla2", 2) _GUICtrlListView_AddItem($h_LV, "") _GUICtrlListView_AddSubItem($h_LV, 3, "bla3", 0) _GUICtrlListView_AddSubItem($h_LV, 3, "bla3", 1) _GUICtrlListView_AddSubItem($h_LV, 3, "bla3", 2) $h_LV_NewWndProc = DllCallbackRegister("WndProc_LV", "int", "hwnd;uint;wparam;lparam") $g_LV_OldWndProc = _WinAPI_SetWindowLong(GUICtrlGetHandle($h_LV), $GWL_WNDPROC, DllCallbackGetPtr($h_LV_NewWndProc)) GUISetState(@SW_SHOW) Func WndProc_LV($hWnd, $uMsg, $wParam, $lParam) Return _WinAPI_CallWindowProc($g_LV_OldWndProc, $hWnd, $uMsg, $wParam, $lParam) EndFunc ;==>WndProc_GUI Do Until GUIGetMsg() = $GUI_EVENT_CLOSE DllCallbackFree($h_LV_NewWndProc) As you can see I'm doing nothing in the WndProc of the listview. I'm simply calling the original WndProc. This still "freezes" when I mess with the width of the columns or in the original project when I add more items that they don't fit in the listview and I have to scroll. If I don't do that it's working fine.
    • c.haslam
      By c.haslam
      I have
      Local $idListview = GUICtrlCreateListView("",8,8,@DesktopWidth/2-16,@DesktopHeight-150,$LVS_SHOWSELALWAYS, _ $LVS_EX_INFOTIP) Local $hListView = GUICtrlGetHandle($idListview) _GUICtrlListView_InsertColumn($hListview, 0, "Filename", 400) _GUICtrlListView_InsertColumn($hListview, 1, "Ext", 50) _GUICtrlListView_InsertColumn($hListview, 2, "Size",70) _GUICtrlListView_InsertColumn($hListview, 3, 'Date time',100) _GUICtrlListView_InsertColumn($hListview, 4, "Path", 385) _GUICtrlListView_InsertColumn($hListview, 5, "sizeInt", 0) _GUICtrlListView_JustifyColumn($hListview, $kSize,1) ; right align then further on
      While True $sFnamExt = FileFindNextFile($iSrch) If @error Then ExitLoop EndIf $sAtts = FileGetAttrib($sPath&'\'&$sFnamExt) If StringInStr($sAtts,'D') Then If $sFnamExt<>'$RECYCLE.BIN' Then $sDirs &= '?'&$sPath&'\'&$sFnamExt EndIf Else $p = StringInStr($sFnamExt,'.',0,-1) ; last If $p=0 Then $sFnam = $sFnamExt $sExt = '' Else $sFnam = StringLeft($sFnamExt,$p-1) $sExt = StringTrimLeft($sFnamExt,$p) EndIf _GUICtrlListView_AddItem($hListview,$sFnam,-1,_GUICtrlListView_GetItemCount($hListview)+1000) _GUICtrlListView_AddSubItem($hListview,$nItem,$sExt,$kExt) $nSize = FileGetSize($sPath&'\'&$sFnamExt) $sSize = AddThousandsSeparator($nsize) _GUICtrlListView_AddSubItem($hListview,$nItem,$sSize,$kSize) _GUICtrlListView_AddSubItem($hListview,$nItem,$nsize,$kSizeInt) $nTotBytes += $nSize $a1 = FileGetTime($sPath&'\'&$sFnamExt,$FT_MODIFIED,$FT_ARRAY) $t = $a1[0]&'-'&$a1[1]&'-'&$a1[2]&' '&$a1[3]&':'&$a1[4] _GUICtrlListView_AddSubItem($hListview,$nItem,$t,$kDateTime) _GUICtrlListView_AddSubItem($hListview,$nItem,$sPath,$kPath) If $gSQL Then $s = "Insert into tbl values ("&_SQLite_Escape($sFnam)&","&_SQLite_Escape($sExt)&",'"& _ $sSize&"','"& _ $t&"',"&_SQLite_Escape($sPath)&","&$nSize&")" _SQLite_Exec(-1,$s) If @error Then MsgBox(0,@ScriptLineNumber,_SQLite_ErrMsg()) EndIf EndIf EndIf WEnd FileClose($iSrch) You will see that I heeded the advice in Help > _GUICtrlListView_AddItem: "As AutoIt uses the $iParam parameter to store the controlID of native-created ListView items, this value should be set sufficiently high for UDF-created items to avoid possible conflict with any existing controls - a starting value of 1000 is recommended."
      (It's unfortunate that the Example does not heed this advice. OK, it doesn't need to because there are no other controls, but still --- it would help neophytes if it did. Also to me _GUICtrlListView_AddItem is not native because it is a UDF. Confused?)
      My script then does a sort using SQLite, and updates the ListView:
      Local $hQuery Local $colNames = ['fnam','ext','nsize','dateTime','path','SizeInt'] Local $s = "Select * FROM tbl ORDER BY "&$colNames[$ncol]&';' _SQLite_Query(-1,$s, $hQuery) If @error Then MsgBox(0,@ScriptLineNumber,_SQLite_ErrMsg()) EndIf Local $aRow[$kSizeInt+1] Local $iItem=-1 While _SQLite_FetchData($hQuery, $aRow, False, False) = $SQLITE_OK ; Read Out the next Row If @error Then MsgBox(0,@ScriptLineNumber,_SQLite_ErrMsg()) EndIf $iItem += 1 For $i = $kFnam To $kSizeInt _GUICtrlListView_SetItem($hListview,$aRow[$i],$iItem,$i,Default) Next WEnd This works, but I had earlier coded
      _GUICtrlListView_SetItem($hListview,$aRow[$i],$iItem,$i,Default,$iItem+1000) because the same advice is in the Help for this function.
      So my care in specifying $param back-fired! What am I not understanding?
      The only difference in what works is that the $param parameter is defaulted.
    • FrancescoDiMuro
      By FrancescoDiMuro
      Good evening everyone
      I am building a management for the company I work with, and I just imported a real amount of rows ( about 29000 ), in my SQLite DB.
      The thing I am not understanding, is the time that the script takes to build this amount of rows in the ListView.
      I didn't measure it, but I think it took 2 minutes or so to create each ListView item...
      It is normal that it takes so much time?
      What can I do to improve the creation of the items?

      Here's the code I am using to query and to create ListView items...
      ; Articles ListView: Global $lvwArticles = GUICtrlCreateListView("ID|Fornitore|Codice|Descrizione|EU|Prezzo|Sconto Applicato|Note", 14, 87, 1507, 660, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_SORTASCENDING,$LVS_SORTDESCENDING), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT)) ; Query $strQuery = "SELECT * FROM ARTICOLI;" ; Query Execution _SQLite_GetTable2d($objDatabase, $strQuery, $arrResult, $intRows, $intColumns) If @error Then ; Error Handling Else ; Cleaning the ListView _GUICtrlListView_DeleteAllItems($lvwArticles) If @error Then ; Error Handling Else ; No records in the Table If UBound($arrResult) < 2 Then ; Error Handling Else _GUICtrlListView_BeginUpdate($lvwArticles) For $intCounter = 1 To UBound($arrResult) - 1 $strListViewItem = $arrResult[$intCounter][0] & "|" & _ $arrResult[$intCounter][1] & "|" & _ $arrResult[$intCounter][2] & "|" & _ $arrResult[$intCounter][3] & "|" & _ $arrResult[$intCounter][4] & "|" & _ $arrResult[$intCounter][5] & "|" & _ $arrResult[$intCounter][6] & "|" & _ $arrResult[$intCounter][7] $objListViewItem = GUICtrlCreateListViewItem($strListViewItem, $lvwArticles) Next _GUICtrlListView_EndUpdate($lvwArticles) EndIf EndIf EndIf Thanks in advance


      Best Regards.
    • Skysnake
      By Skysnake
      I am tracking this topic by @LarsJ.  It is very advanced and overkill for what I am currently trying to do.
       
      Problem is this.
      Listview contains columns, one of which is right aligned and gets populated by float values, such as 123.99.  Some do not have decimals ie 124.00 and on sort gets truncated to 124.  Its obviously still the same value, but the display has reset.
      ; line below is for list VIEW ;..................................0.........1......2............ $cListView = GUICtrlCreateListView("CUSTOMER|AMOUNT|DESCRIPTION", 8, 152, 764, 279) GUICtrlSetBkColor($cListView, $GUI_BKCOLOR_LV_ALTERNATE) ; alternate between the listview background color and the listview item background color GUICtrlSetBkColor($cListView, $LVStdClr) ; Set the background color for the listview _GUICtrlListView_SetColumnWidth($cListView, 0, 120) ; -- the client name _GUICtrlListView_SetColumnWidth($cListView, 1, 90) ;-- the amount _GUICtrlListView_JustifyColumn($cListView, 1, 1) ; 1 - Text is right aligned _GUICtrlListView_SetColumnWidth($cListView, 2, 200) ; the description What I am looking for is something native and simple like a 
          _GUICtrlListView_SetColumnFormat($cListView, 1, "%.2f") ;  1 - column is stringformatted to "%.2f"
      So that after each sort it will appear as it was in the original rendering.
      Is there something like this? I have not been able to find a simple solution.

      Thanks.
      Skysnake
    • Ambient
      By Ambient
      I have tried several way sto get this to work to no avail. Any help would be appreciated. #include <ListViewConstants.au3> #include <GuiListView.au3> #include "GuiListViewEx.au3" $idItem = GUICtrlCreateListViewItem($r & " | " & $c & $adoRs.Fields("TransactionAmount").value & " | " & $Timestamp & " | " & _StringProper($adoRs.Fields("Tillid").value) & @CRLF & @CRLF & "Card Number : " & $cardnum & " " , $idListView) ConsoleWrite( "IDITEM" & $idItem) If STRINGLEFT($adoRs.Fields("TransactionAmount").value,1)= "-" Then Consolewrite(" String is Negative" & @CRLF) ;Drops in Here as expected ;GUICtrlSetColor(-1, $COLOR_RED) ; Colour line if item is negative this didn' work $TxC= _GUICtrlListView_SetTextColor($hListView, $CLR_RED) ; I also tried $TxC= _GUICtrlListView_SetTextColor(-1, 0xFF0000) CONSOLEWRITE("TEXTCOLOUR RETURNED " & $TxC & @crlf) ; This is returning True ELSE Consolewrite(" String is NOT Negative" & @CRLF) EndIf  
×