Jump to content

[SOLVED] ListView update image help


rootx
 Share

Recommended Posts

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
Link to comment
Share on other sites

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

 

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
Link to comment
Share on other sites

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)

 

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

  • 1 year later...
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.

Link to comment
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
 Share

×
×
  • Create New...