Jump to content

How to easly make list with images?


Recommended Posts

I were trying normal way to create image list but it didnt worked and it were too complex.

I need list like ListBox but with images too.

Is there any easy function or UDF where adding list would be like writing some func  addList("image.png","Line text") ?

Making image lists with those funcs are very messy. I need really big list and I will need to manage it alot.

 

Images for example :

Jegd7vMb5lV.pngHGdGnr7OGkc.png4WpaX_R-VnQ.pngnyGEC6hOf9m.png

they might be bigger or smaller. How I want my list too look like (paint) -

is8102j.png

 

 

 

 

 

 

Last edit: everything works.. just images not converted properly..

Edited by AntiFros
Link to comment
Share on other sites

#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

_Main()

Func _Main()
    Local $listview, $hImage
    GUICreate("ImageList AddBitmap", 400, 300)
    $listview = GUICtrlCreateListView("", 2, 2, 394, 268, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($listview, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER))
    GUISetState()
    $hImage = _GUIImageList_Create(42, 42)
    _GUIImageList_AddBitmap($hImage, @ScriptDir &"test.bmp")
    _GUICtrlListView_SetImageList($listview, $hImage, 1)
    _GUICtrlListView_AddColumn($listview, "Items", 120)
    _GUICtrlListView_AddItem($listview, "Item 1", 0)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc

Wont work..

test.bmp -> 4WpaX_R-VnQ.png (save as .bmp)

 

 

 

 

 

 

---------------------------------------------

Ok found this nice way. It work fine for now.

Edit: nah dont work when I want to add more than one.. Always same pic

#Include <GDIPlus.au3>
#Include <GUIImageList.au3>
#Include <GUIListView.au3>

_GDIPlus_Startup()

$hForm = GUICreate('MyGUI', 400, 400, 302, 218)
$hListView = GUICtrlCreateListView('', 10, 10, 380, 380)
_GUICtrlListView_AddColumn($hListView, 'Items', 200)
$hImageList = _GUIImageList_Create(15, 16, 5, 1)
_GUICtrlListView_SetImageList($hListView, $hImageList, 1)
_GUIImageList_AddImage($hImageList, -1, @ScriptDir & '\test.bmp')
_GUICtrlListView_AddItem($hListView, 'Testassss', 0)

GUISetState()












Do
Until GUIGetMsg() = -3

Func _GUIImageList_AddImage($hWnd, $iIndex, $sFile)

    Local $Size = _GUIImageList_GetIconSize($hWnd)

    If (Not $Size[0]) Or (Not $Size[1]) Then
        Return -1
    EndIf

    Local $W, $H, $hGraphic, $hPic, $hImage, $hIcon

    _GDIPlus_Startup()
    $hPic = _GDIPlus_ImageLoadFromFile($sFile)
    $W = _GDIPlus_ImageGetWidth($hPic)
    $H = _GDIPlus_ImageGetHeight($hPic)
    If ($W < 0) Or ($H < 0) Then
        _GDIPlus_Shutdown()
        Return -1
    EndIf
    If $W < $H Then
        $W = $Size[0] * $W / $H
        $H = $Size[1]
    Else
        $H = $Size[1] * $H / $W
        $W = $Size[0]
    EndIf
    $hImage = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hPic, 'int', $Size[0], 'int', $Size[1], 'ptr*', 0, 'ptr', 0, 'ptr', 0)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage[4])
    _GDIPlus_GraphicsClear($hGraphic, 0)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hPic, ($Size[0] - $W) / 2, ($Size[1] - $H) / 2, $W, $H)
    $hIcon = DllCall($ghGDIPDll, 'int', 'GdipCreateHICONFromBitmap', 'ptr', $hImage[4], 'ptr*', 0)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage[4])
    _GDIPlus_ImageDispose($hPic)
    _GDIPlus_Shutdown()
    If Not $hIcon[2] Then
        Return -1
    EndIf
    $iIndex = _GUIImageList_ReplaceIcon($hWnd, $iIndex, $hIcon[2])
    _WinAPI_DestroyIcon($hIcon[2])
    Return $iIndex
EndFunc   ;==>_GUIImageList_AddImag
Edited by AntiFros
Link to comment
Share on other sites

In your first example you had these bugs:

$hImage = _GUIImageList_Create(42, 42) ; -> should be 20
_GUIImageList_AddBitmap($hImage, @ScriptDir &"test.bmp") ; -> missing \

correct:

$hImage = _GUIImageList_Create(20, 20)
_GUIImageList_AddBitmap($hImage, @ScriptDir &"\test.bmp")

Also your image must be bitmap not PNG file! (check it internally not only by its extension)

After these fixes all works fine.

Edited by Zedna
Link to comment
Share on other sites

 

Edit: nah dont work when I want to add more than one.. Always same pic

#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>

Example()

Func Example()
    Local $listview, $hImage
    Local $exStyles = BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)

    GUICreate("ImageList Add", 400, 300)
    $listview = GUICtrlCreateListView("", 2, 2, 394, 268, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($listview, $exStyles)
    GUISetState(@SW_SHOW)

    ; Load images
    $hImage = _GUIImageList_Create(11, 11)
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($listview, [PATH TO IMAGE 1], 11, 11))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($listview, [PATH TO IMAGE 2], 11, 11))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($listview, [PATH TO IMAGE 3], 11, 11))
    _GUICtrlListView_SetImageList($listview, $hImage, 1)

    ; Add columns
    _GUICtrlListView_AddColumn($listview, "Items", 120)

    ; Add items
    _GUICtrlListView_AddItem($listview, "Item 1", 0); WILL USE IMAGE 1 BECAUSE IT IS THE FIRST INDEX OF 0
    _GUICtrlListView_AddItem($listview, "Item 2", 1) ; WILL USE IMAGE 2 BECAUSE IT IS THE SECOND INDEX OF 1
    _GUICtrlListView_AddItem($listview, "Item 3", 2); WILL USE IMAGE 3 BECAUSE IT IS THE THIRD INDEX OF 2

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>Example

Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt

Link to comment
Share on other sites

Thanks for help. Now I can make list with images easly. The main problem was that I used renamed png pictures and no real bmp.

Now how to manage my list easly? With those indexes are too complex.

#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$_1 = GUICreate("ImageList AddBitmap", 400, 339, 264, 129)
    $listview = GUICtrlCreateListView("", 2, 2, 394, 268, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($listview, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER))
    GUISetState(@SW_SHOW)
$image = GUICtrlCreateInput("fb.bmp", 8, 296, 177, 21)
$name = GUICtrlCreateInput("Test", 192, 296, 73, 21)
$add = GUICtrlCreateButton("add", 280, 296, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

; Load images
   global $hImage = _GUIImageList_Create(15, 15)
    _GUIImageList_AddBitmap($hImage,"1.bmp")
   _GUIImageList_AddBitmap($hImage, "2.bmp")
    _GUIImageList_AddBitmap($hImage,"3.bmp")
   _GUIImageList_AddBitmap($hImage,"4.bmp")
    _GUICtrlListView_SetImageList($listview, $hImage, 1)

    ; Add columns
    _GUICtrlListView_AddColumn($listview, "  Y", 150)
    ; Add items
    _GUICtrlListView_AddItem($listview, "1", 0)
    _GUICtrlListView_AddItem($listview, "2", 1)
    _GUICtrlListView_AddItem($listview, "3", 2)
   _GUICtrlListView_AddItem($listview, "4", 3)



While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $add
            addItem(GUICtrlRead($image),GUICtrlRead($name))
    EndSwitch
WEnd



Func addItem($image,$name)
    _GUIImageList_AddBitmap($hImage,$image)
    _GUICtrlListView_AddItem($listview, $name, 0)  ;how to manage those indexes???
Endfunc

Also I need to delete or transfer some entries to another list..

 

Rar pack to do tests. bmp images included. V

 

list.rar

Link to comment
Share on other sites

Look at my script, test it and you will see.

I want to add my list ouside script. In this case I made GUI to show you. So how I need to pair image and text?

Inside script you just can do this

 _GUIImageList_AddBitmap($hImage,$image)
 _GUICtrlListView_AddItem($listview, $name, [index])

but how to do it ouside script? When I only have image and item name.

Edited by AntiFros
Link to comment
Share on other sites

Im talking not about _GUIImageList_AddBitmap($hImage,$image)..

About

 _GUICtrlListView_AddItem($listview, $name, [index])

Download my attached file "list.rar" run script and try to add new content with different pictures. The pic always be the same because it needs index. So I need to pair it.  

Yeah It can be written by hand in code but I will need to have over 300 images with text in list..

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

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...