ListView mit Checkboxen und Edit Controls

  • Hey grüßt euch,
    ich möchte eine Art extended Listview mit Checkboxen und Edit Controls bauen. Ich bin soweit, dass ich die Controls integriert habe, allerdings werden die Edit Controls nicht wie die Checkboxen gezeichnet werden sondern mit _WinAPI_CreateWindowEx erstellt werden. Dementsprechend werden die Edits beim scrollen nicht neu gezeichnet und so bleiben die Edits immer On Top, also verschwinden nicht beim Scrollen. Hat jemand eine Idee wie ich das lösen kann?

    [autoit]

    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>
    #include <GuiEdit.au3>
    #include <Constants.au3>
    #include <WinAPIEx.au3> ; from <a href='http://www.autoitscript.com/forum/topic/98712-winapiex-udf/' class='bbc_url' title=''>http://www.autoitscript.com/forum/topic/98712-winapiex-udf/</a>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Global $aProgress[1][4] ; stores handles of edit controls
    Global Const $ODT_LISTVIEW = 102
    Global Const $ODA_DRAWENTIRE = 0x1
    Global Const $SW_HIDE = 0
    Global Const $SW_SHOW = 5
    ; ####################################
    ; adjustment of the icon positioning, according to windows version
    Global $iAdjustV = 0
    If $__WINVER > 0x0600 Then $iAdjustV = 1 ; $__WINVER defined in WinAPIEx, $__WINVER > 0x0600 means Vista+
    ; ####################################

    [/autoit][autoit][/autoit][autoit]

    ; WM_MEASUREITEM allows setting the row height
    Global $iListView_row_height, $hIml_Listview, $hListView
    GUIRegisterMsg($WM_MEASUREITEM, "WM_MEASUREITEM") ; place before listview creation - message sent once for each ownerdrawn control created
    Global $ids = 101

    [/autoit][autoit][/autoit][autoit]

    $hGUI = GUICreate("ListView Set Item State", 700, 300)
    $cButton_CheckAll = GUICtrlCreateButton("Check All", 10, 275, 100, 20)
    $cButton_UncheckAll = GUICtrlCreateButton("UnCheck All", 120, 275, 100, 20)
    $cButton_StatesToArray = GUICtrlCreateButton("States to Array", 230, 275, 100, 20)

    [/autoit][autoit][/autoit][autoit]

    $iListView_row_height = 25
    $checkbox_column = 2
    $edit_column = 3
    _GDIPlus_Startup()
    $cListView = _GUICtrlCreateListViewEx("", 2, 2, 394, 268)

    [/autoit][autoit][/autoit][autoit]

    ; Add columns
    _GUICtrlListView_AddColumn($hListView, " ", 0)
    For $i = 1 To 3
    _GUICtrlListView_AddColumn($hListView, "Column " & $i, 100)
    Next
    Local $aItems[30][4]
    For $row = 0 To 29
    $aItems[$row][0] = "this won't show up"
    $aItems[$row][1] = ""
    $aItems[$row][2] = "Row " & $row & ": Col 2"
    ;~ $aItems[$row][3] = "Row " & $row & ": Col 3"
    ; _ListView_InsertEdit($hListView, $row, $edit_column)
    Next

    [/autoit][autoit][/autoit][autoit]

    ; only for testing
    For $row = 0 To 29
    _ListView_InsertEdit($hListView, $row, $edit_column)
    Next

    [/autoit][autoit][/autoit][autoit]

    _GUICtrlListView_DeleteAllItems($hListView)
    __GUI_ListView_Add_Array($hListView, $aItems) ; workaround
    ; -----------------------------------------------------------

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; Loop until user exits
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $cButton_CheckAll
    _LV_ImgCheckboxes_CheckAll($hListView)
    Case $cButton_UncheckAll
    _LV_ImgCheckboxes_UncheckAll($hListView)
    Case $cButton_StatesToArray
    $aLVStates = _LV_ImgCheckboxes_StatesToArray($hListView)
    _ArrayDisplay($aLVStates)
    EndSwitch
    WEnd
    GUIDelete()
    _GUIImageList_Destroy($hIml_Listview)
    _GDIPlus_Shutdown()
    Exit

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func __GUI_ListView_Add_Array($hListView, ByRef $array)
    If Not IsArray($array) Then Return SetError(1, 0, 0) ; not an array
    Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView)
    ; if the number of columns between the array and the listview doesn't match:
    If UBound($array,2) <> $iColumnCount Then Return SetError(3, 1, 0)
    Switch UBound($array, 0)
    Case 1 ; 1-dimensioned array
    _GUICtrlListView_BeginUpdate($hListView)
    For $r = 0 To UBound($array, 1) - 1
    _GUICtrlListView_AddItem($hListView, $array[$r], 0)
    Next
    _GUICtrlListView_EndUpdate($hListView)
    Case 2 ; 2-dimensioned array
    _GUICtrlListView_BeginUpdate($hListView)
    Local $first_row
    For $r = 0 To UBound($array, 1) - 1
    If $r = 0 Then
    $first_row = _GUICtrlListView_AddItem($hListView, $array[$r][0], 0)
    Else
    _GUICtrlListView_AddItem($hListView, $array[$r][0], 0)
    EndIf
    Next
    For $r = 0 To UBound($array, 1) - 1
    For $c = 1 To UBound($array, 2) - 1
    ;ConsoleWrite($array[$r][$c] & " " & VarGetType($array[$r][$c]) & @CRLF & @CRLF)
    _GUICtrlListView_AddSubItem($hListView, $first_row + $r, $array[$r][$c], $c, 0)
    Next
    Next
    _GUICtrlListView_EndUpdate($hListView)
    Case Else
    Return SetError(2, 0, 0) ; invalid array (over 2 dimensions)
    EndSwitch
    Return
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _GUICtrlCreateListViewEx($lText, $lX, $lY, $lWidth = 50, $lHeight = 50, $lStyle = 0, $lExStyle = 0)
    _GDIPlus_Startup()
    Local $hBitmap_Icon
    $lStyle = BitOR($lStyle, $LVS_REPORT, $LVS_OWNERDRAWFIXED, $LVS_SHOWSELALWAYS, $LVS_SINGLESEL)
    $lExStyle = BitOR($lExStyle, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_TRACKSELECT)
    Local $cListView = GUICtrlCreateListView($lText, $lX, $lY, $lWidth, $lHeight, $lStyle)
    $hListView = GUICtrlGetHandle($cListView)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, $lExStyle)
    ; create checkbox images check and uncheck
    $hIml_Listview = _GUIImageList_Create(16, 16, 5, 3)
    $hBitmap_Icon = _Load_BMP_From_Mem(_Icon_Image_Checkbox_Unchecked(), True)
    _GUIImageList_Add($hIml_Listview, $hBitmap_Icon)
    _WinAPI_DeleteObject($hBitmap_Icon)
    $hBitmap_Icon = _Load_BMP_From_Mem(_Icon_Image_Checkbox_Checked(), True)
    _GUIImageList_Add($hIml_Listview, $hBitmap_Icon)
    _WinAPI_DeleteObject($hBitmap_Icon)
    Return $cListView
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    Local $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    Local $nNotifyCode = DllStructGetData($tNMHDR, "Code")
    ; if header size is changed, change size of edit controls
    Switch $nNotifyCode
    Case $HDN_ITEMCHANGED, $HDN_ITEMCHANGEDW
    For $i = 1 To $aProgress[0][0]
    _MoveEdit($hListView, $aProgress[$i][0], $aProgress[$i][1], $aProgress[$i][2])
    Next
    EndSwitch
    ; if checkbox image is clicked
    Switch $hWndFrom
    Case $hListView
    Switch $nNotifyCode
    Case $NM_CLICK
    Local $tINFO = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $iItem = DllStructGetData($tINFO, "Index")
    Local $iSubitem = DllStructGetData($tINFO, "SubItem")
    ; click event for checkboxes in column 2
    If $iSubitem == $checkbox_column And StringLen(_GUICtrlListView_GetItemText($hListView, $iItem, $iSubitem)) > 0 Then
    ;ConsoleWrite("painting row "&$iItem+1&" col "&$iSubitem+1&@CRLF)
    _GUICtrlListView_SetItemImage($hListView, $iItem, Not _GUICtrlListView_GetItemImage($hListView, $iItem, $iSubitem), $iSubitem)
    EndIf
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
    ;~ ConsoleWrite($hWnd & " " & $Msg & " " & $wParam & " " & $lParam & @CRLF)
    Local $tagDRAWITEMSTRUCT, $iBrushColor, $cID, $itmID, $itmAction, $itmState, $hItm, $hDC
    $timer = TimerInit()
    $tagDRAWITEMSTRUCT = DllStructCreate( _
    "uint cType;" & _
    "uint cID;" & _
    "uint itmID;" & _
    "uint itmAction;" & _
    "uint itmState;" & _
    "hwnd hItm;" & _
    "hwnd hDC;" & _
    "int itmRect[4];" & _
    "dword itmData" _
    , $lParam)
    If DllStructGetData($tagDRAWITEMSTRUCT, "cType") <> $ODT_LISTVIEW Then Return $GUI_RUNDEFMSG
    $cID = DllStructGetData($tagDRAWITEMSTRUCT, "cID")
    $itmID = DllStructGetData($tagDRAWITEMSTRUCT, "itmID")
    $itmAction = DllStructGetData($tagDRAWITEMSTRUCT, "itmAction")
    $itmState = DllStructGetData($tagDRAWITEMSTRUCT, "itmState")
    $hItm = DllStructGetData($tagDRAWITEMSTRUCT, "hItm")
    $hDC = DllStructGetData($tagDRAWITEMSTRUCT, "hDC")
    Local $aDefaultVariables[9] = [$tagDRAWITEMSTRUCT, $iBrushColor, $cID, $itmID, $itmAction, $itmState, $hItm, $hDC]
    Switch $cID ; will look for ControlID, not window handle.
    Case $cListView
    Switch $itmAction
    Case $ODA_DRAWENTIRE
    Local $aRowColors[2] = [0xFDFDFD, 0xEEDDBB]
    Local $aRectMargins[4] = [6, -1, -4, 0]
    Local $aTextFormatting[5] = [-1, _
    BitOR($DT_VCENTER, $DT_SINGLELINE, $DT_CENTER, $DT_END_ELLIPSIS), _
    BitOR($DT_VCENTER, $DT_SINGLELINE, $DT_CENTER, $DT_END_ELLIPSIS), _
    BitOR($DT_VCENTER, $DT_SINGLELINE, $DT_RIGHT, $DT_END_ELLIPSIS), _
    BitOR($DT_VCENTER, $DT_SINGLELINE, $DT_END_ELLIPSIS)]
    __WM_DRAWITEM_ListView($hListView, $aDefaultVariables, $aRowColors, $aRectMargins, $aTextFormatting)
    ; end case
    EndSwitch
    ; end case
    EndSwitch
    ;~ ConsoleWrite(Round(TimerDiff($timer),2) & @TAB & "WM_DRAWITEM" & @CRLF)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_DRAWITEM

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func __WM_DRAWITEM_ListView($hListView, ByRef $aDefaultVariables, ByRef $aRowColors, ByRef $aRectMargins, ByRef $aTextFormatting)
    Local $iSubItemCount = _GUICtrlListView_GetColumnCount($hListView)
    If UBound($aTextFormatting) < $iSubItemCount Then Return ConsoleWrite("!> Error: invalid parameters in __WM_DRAWITEM_ListView()" & @CRLF)
    Local $tagDRAWITEMSTRUCT, $iBrushColor, $cID, $itmID, $itmAction, $itmState, $hItm, $hDC
    $tagDRAWITEMSTRUCT = $aDefaultVariables[0]
    $iBrushColor = $aDefaultVariables[1]
    $cID = $aDefaultVariables[2]
    $itmID = $aDefaultVariables[3]
    $itmAction = $aDefaultVariables[4]
    $itmState = $aDefaultVariables[5]
    $hItm = $aDefaultVariables[6]
    $hDC = $aDefaultVariables[7]
    If _GUICtrlListView_GetItemSelected($hListView, $itmID) Then
    $iBrushColor = $aRowColors[1]
    Else
    $iBrushColor = $aRowColors[0]
    EndIf
    ; create a brush with the desired color:
    Local $aBrush = DllCall("gdi32.dll", "hwnd", "CreateSolidBrush", "int", $iBrushColor)
    ; get the rectangle for the whole row and fill it:
    Local $iLeft = DllStructGetData($tagDRAWITEMSTRUCT, "itmRect", 1)
    DllStructSetData($tagDRAWITEMSTRUCT, "itmRect", $iLeft + 0, 1) ; +0 is the left margin
    _WinAPI_FillRect($hDC, DllStructGetPtr($tagDRAWITEMSTRUCT, "itmRect"), $aBrush[0])
    ; draw the text in each subitem
    For $i = 0 To $iSubItemCount - 1
    ; get subitem text:
    Local $iSubItmText = _GUICtrlListView_GetItemText($hListView, $itmID, $i)
    ;~ ConsoleWrite($itmID & " ")
    ; get subitem coordinates for drawing its respective text:
    Local $aSubItmRect = _GUICtrlListView_GetSubItemRect($hListView, $itmID, $i)
    ; the function above accepts not only subitems (one-based index), but also main item (index=0)
    ; pass the coordinates to a DLL struct:
    Local $iSubItmRect = DllStructCreate("int Left;int Top;int Right;int Bottom")
    DllStructSetData($iSubItmRect, 1, $aSubItmRect[0] + $aRectMargins[0]) ; left margin
    DllStructSetData($iSubItmRect, 2, $aSubItmRect[1] + $aRectMargins[1]) ; upper margin
    DllStructSetData($iSubItmRect, 3, $aSubItmRect[2] + $aRectMargins[2]) ; right margin
    DllStructSetData($iSubItmRect, 4, $aSubItmRect[3] + $aRectMargins[3]) ; bottom margin
    Local $tRect = DllStructGetPtr($iSubItmRect)
    ;#cs
    If $cID == $cListView And StringLen($iSubItmText) > 0 And $aTextFormatting[$i] <> - 1 Then
    Local $hIcon = _GUIImageList_GetIcon($hIml_Listview, _GUICtrlListView_GetItemImage($hListView, $itmID, $i))
    If $i = 0 Then ; the first column of a listview needs more handling than the other columns (sub-items)
    #cs
    ; positioning for the icon:
    DllStructSetData($iSubItmRect, "Left", DllStructGetData($iSubItmRect, "Left") + 12)
    _WinAPI_DrawIconEx($hDC, DllStructGetData($iSubItmRect, "Left") - 16, Int((DllStructGetData($iSubItmRect, "Bottom") + DllStructGetData($iSubItmRect, "Top") - 16)/2) + $iAdjustV, $hIcon, 16, 16)
    ; positioning for the text:
    DllStructSetData($iSubItmRect, "Left", DllStructGetData($iSubItmRect, "Left") + 4)
    #ce
    ; draw checkbox images
    ElseIf $i == $checkbox_column Then
    _WinAPI_DrawIconEx($hDC, DllStructGetData($iSubItmRect, "Left"), Int((DllStructGetData($iSubItmRect, "Bottom") + DllStructGetData($iSubItmRect, "Top") - 16) / 2) - 1 + $iAdjustV, $hIcon, 16, 16)
    ; positioning for the text:
    DllStructSetData($iSubItmRect, "Left", DllStructGetData($iSubItmRect, "Left") + 20)
    EndIf
    _GUIImageList_DestroyIcon($hIcon)
    EndIf
    ;#ce
    ; column 3 has no text content so return here
    If $i == $edit_column Then
    ; if focus on edit controls
    Local $focus = ControlGetFocus($hGUI)
    If StringInStr( $focus, "Edit") Then
    ConsoleWrite("Jetzt" & " ")
    Sleep(1000)
    GUICtrlSetState(6, $GUI_FOCUS)
    EndIf
    _MoveEdit($hListView, $aProgress[$itmID][0], $aProgress[$itmID][1], $aProgress[$itmID][2])
    Return
    EndIf
    If $aTextFormatting[$i] = -1 Then
    ; do nothing (don't draw any text)
    Else
    ;ConsoleWrite($hDC & " " & $iSubItmText& " " & $tRect& " " & $aTextFormatting[$i] &@CRLF & "------------------------------------------"&@CRLF)
    _WinAPI_DrawText($hDC, $iSubItmText, $tRect, $aTextFormatting[$i])
    EndIf
    Next
    EndFunc ;==>__WM_DRAWITEM_ListView

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func WM_MEASUREITEM($hWnd, $Msg, $wParam, $lParam)
    Local $tMEASUREITEMS = DllStructCreate("uint cType;uint cID;uint itmID;uint itmW;uint itmH;ulong_ptr itmData", $lParam)
    If DllStructGetData($tMEASUREITEMS, "cType") <> $ODT_LISTVIEW Then Return $GUI_RUNDEFMSG
    DllStructSetData($tMEASUREITEMS, "itmH", $iListView_row_height) ; row height
    Return 1
    EndFunc ;==>WM_MEASUREITEM

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; Based on File to Base64 String Code Generator
    ; by UEZ
    ; <a href='http://www.autoitscript.com/forum/topic/...ng-code-generator-v103-build-2' class='bbc_url' title=''>http://www.autoitscript.com/forum/topic/..…or-v103-build-2</a>
    ;======================================================================================
    ; Function Name: Load_BMP_From_Mem
    ; Description: Loads an image which is saved as a binary string and converts it to a bitmap or hbitmap
    ;
    ; Parameters: $bImage: the binary string which contains any valid image which is supported by GDI+
    ; Optional: $hHBITMAP: if false a bitmap will be created, if true a hbitmap will be created
    ;
    ; Remark: hbitmap format is used generally for GUI internal images, $bitmap is more a GDI+ image format
    ; Don't forget _GDIPlus_Startup() and _GDIPlus_Shutdown()
    ;
    ; Requirement(s): GDIPlus.au3, Memory.au3 and _GDIPlus_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
    ; Return Value(s): Success: handle to bitmap (GDI+ bitmap format) or hbitmap (WinAPI bitmap format),
    ; Error: 0
    ; Error codes: 1: $bImage is not a binary string
    ; 2: unable to create stream on HGlobal
    ; 3: unable to create bitmap from stream
    ;
    ; Author(s): UEZ
    ; Additional Code: thanks to progandy for the MemGlobalAlloc and tVARIANT lines and
    ; Yashied for _GDIPlus_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
    ; Version: v0.97 Build 2012-01-04 Beta
    ;=======================================================================================
    Func _Load_BMP_From_Mem($bImage, $hHBITMAP = False)
    If Not IsBinary($bImage) Then Return SetError(1, 0, 0)
    Local $aResult
    Local Const $memBitmap = Binary($bImage) ;load image saved in variable (memory) and convert it to binary
    Local Const $len = BinaryLen($memBitmap) ;get length of image
    Local Const $hData = _MemGlobalAlloc($len, $GMEM_MOVEABLE) ;allocates movable memory ($GMEM_MOVEABLE = 0x0002)
    Local Const $pData = _MemGlobalLock($hData) ;translate the handle into a pointer
    Local $tMem = DllStructCreate("byte[" & $len & "]", $pData) ;create struct
    DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
    _MemGlobalUnlock($hData) ;decrements the lock count associated with a memory object that was allocated with GMEM_MOVEABLE
    $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $pData, "int", True, "ptr*", 0) ;Creates a stream object that uses an HGLOBAL memory handle to store the stream contents
    If @error Then SetError(2, 0, 0)
    Local Const $hStream = $aResult[3]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "int*", 0) ;Creates a Bitmap object based on an IStream COM interface
    If @error Then SetError(3, 0, 0)
    Local Const $hBitmap = $aResult[2]
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, _
    "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;release memory from $hStream to avoid memory leak
    $tMem = 0
    $tVARIANT = 0
    If $hHBITMAP Then
    Local Const $hHBmp = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    Return $hHBmp
    EndIf
    Return $hBitmap
    EndFunc ;==>_Load_BMP_From_Mem

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    Local $tBIHDR, $Ret, $tData, $pBits, $hResult = 0
    $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hBitmap, 'float*', 0, 'float*', 0)
    If (@error) Or ($Ret[0]) Then Return 0
    $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Ret[2], $Ret[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    $pBits = DllStructGetData($tData, 'Scan0')
    If Not $pBits Then Return 0
    $tBIHDR = DllStructCreate('dword;long;long;ushort;ushort;dword;dword;long;long;dword;dword')
    DllStructSetData($tBIHDR, 1, DllStructGetSize($tBIHDR))
    DllStructSetData($tBIHDR, 2, $Ret[2])
    DllStructSetData($tBIHDR, 3, $Ret[3])
    DllStructSetData($tBIHDR, 4, 1)
    DllStructSetData($tBIHDR, 5, 32)
    DllStructSetData($tBIHDR, 6, 0)
    $hResult = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBIHDR), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'dword', 0)
    If (Not @error) And ($hResult[0]) Then
    DllCall('gdi32.dll', 'dword', 'SetBitmapBits', 'ptr', $hResult[0], 'dword', $Ret[2] * $Ret[3] * 4, 'ptr', DllStructGetData($tData, 'Scan0'))
    $hResult = $hResult[0]
    Else
    $hResult = 0
    EndIf
    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)
    Return $hResult
    EndFunc ;==>_GDIPlus_BitmapCreateDIBFromBitmap

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Decompress_Binary_String_to_Bitmap($Base64String)
    $Base64String = Binary($Base64String)
    Local $iSize_Source = BinaryLen($Base64String)
    Local $pBuffer_Source = _WinAPI_CreateBuffer($iSize_Source)
    DllStructSetData(DllStructCreate('byte[' & $iSize_Source & ']', $pBuffer_Source), 1, $Base64String)
    Local $pBuffer_Decompress = _WinAPI_CreateBuffer(8388608)
    Local $Size_Decompressed = _WinAPI_DecompressBuffer($pBuffer_Decompress, 8388608, $pBuffer_Source, $iSize_Source)
    Local $b_Result = Binary(DllStructGetData(DllStructCreate('byte[' & $Size_Decompressed & ']', $pBuffer_Decompress), 1))
    _WinAPI_FreeMemory($pBuffer_Source)
    _WinAPI_FreeMemory($pBuffer_Decompress)
    Return $b_Result
    EndFunc ;==>_Decompress_Binary_String_to_Bitmap

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Icon_Image_Checkbox_Unchecked()
    Local $Base64String
    $Base64String &= '7rBIAAABABAQEAFwCAAAaAUAABYAAMwAKAAYAJAAIAAYAVwZAQBAAQIYDgCAgAAAANfc3ADZ3t4AANvg4ADe4uIAAOLl5QDl6OgAAOns7ADs7+8AAO/x8QDx8/MAAPT19QD29/cAAPj5+QD6+/sAAPz9/QD+/v7wAP///xNc/wB/AD8A/z8APwA/AD8APwA/AD8ACAAb4HYLAAEJAOEBCgsMAA0ODxAREhISbeIBCQcC4gEIBwLiAQfbBwLiAQYHAuIBBQcC4gG2BAcC4gEDBwLiAQIHAv/jAQcC5AEGAuIB7BceAOCfHgN/AG0A4QZhAA=='
    Return _Decompress_Binary_String_to_Bitmap(_Base64Decode($Base64String))
    EndFunc ;==>_Icon_Image_Checkbox_Unchecked

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Icon_Image_Checkbox_Checked()
    Local $Base64String
    $Base64String &= 'z7BIAAABABAQEAFwCAAAaAUAABYAAMwAKAAYAJAAIAAYAVwZAQBAAQIYDgCAgAAAAISEhADe3t5AAN7n5wDnAQbvCO8A7wEG9/cA9/EABv///xN4/wE/AD8A/z8APwA/AD8AHwAMAOB6CwAGAQkA4QEHCAkJCR4KAgDjAQcC5AEHCAKDAwLiAQYHBwICAwI54gEFBsABAwLjAQUCxgIkBOIBBAUCRQbjAVgEBQUCAuQBAwUCCPPkAQUCBwjkAQYC4gHsF3seAOCfA38AbQDhBmEA'
    Return _Decompress_Binary_String_to_Bitmap(_Base64Decode($Base64String))
    EndFunc ;==>_Icon_Image_Checkbox_Checked

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Base64Decode($input_string)
    Local $struct = DllStructCreate("int")
    Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(1, 0, "")
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($a, 1)
    EndFunc ;==>_Base64Decode

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _ListView_InsertEdit($sHwnd, $sItemIndex, $sSubItemIndex = 0)
    If Not IsHWnd($sHwnd) Then $sHwnd = GUICtrlGetHandle($sHwnd)
    Local $iStyle = _WinAPI_GetWindowLong($sHwnd, $GWL_STYLE)
    If BitAND($iStyle, $WS_CLIPCHILDREN) <> $WS_CLIPCHILDREN Then
    _WinAPI_SetWindowLong($sHwnd, $GWL_STYLE, BitOR($iStyle, $WS_CLIPCHILDREN))
    EndIf
    Local $aRect
    If $sSubItemIndex = 0 Then
    $aRect = _GUICtrlListView_GetItemRect($sHwnd, $sItemIndex, 2)
    Else
    $aRect = _GUICtrlListView_GetSubItemRect($sHwnd, $sItemIndex, $sSubItemIndex)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $aProgress[0][0] += 1
    ReDim $aProgress[$aProgress[0][0]+1][4]
    $aProgress[$aProgress[0][0]][0] = _Edit_Create($sHwnd, $aRect[0] + 6, $aRect[1] + 2, ($aRect[2] - $aRect[0]) - 12, ($aRect[3] - $aRect[1]) - 4)

    [/autoit][autoit][/autoit][autoit]

    $aProgress[$aProgress[0][0]][1] = $sItemIndex
    $aProgress[$aProgress[0][0]][2] = $sSubItemIndex
    $aProgress[$aProgress[0][0]][3] = $sHwnd

    Return $aProgress[$aProgress[0][0]][0]
    EndFunc ;==>_ListView_InsertEdit

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Edit_Create($hWnd, $iX, $iY, $iWidth = -1, $iHeight = -1, $iStyle = 0, $iExStyle = 0x00000200)
    $ids += 1

    [/autoit][autoit][/autoit][autoit]

    $iStyle = BitOR($iStyle, $WS_TABSTOP, $WS_CHILD, $WS_VISIBLE, $ES_LEFT, $ES_AUTOHSCROLL, $ES_NOHIDESEL)
    Local $hEdit = _WinAPI_CreateWindowEx($iExStyle, "EDIT", "", $iStyle, $iX, $iY, $iWidth, $iHeight, $hWnd, $ids)
    _SendMessage($hEdit, $__EDITCONSTANT_WM_SETFONT, _WinAPI_GetStockObject($__EDITCONSTANT_DEFAULT_GUI_FONT), True) ; set font style

    ; testen
    _GUICtrlEdit_SetLimitText($hEdit, 0)
    _GUICtrlEdit_SetText($hEdit, "test"&$ids)

    [/autoit][autoit][/autoit][autoit]

    Return $hEdit
    EndFunc ;==>_Edit_Create

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _MoveEdit($hListView, $hProgress, $sItemIndex, $sSubItemIndex)
    Local $aRect

    If $sSubItemIndex = 0 Then
    $aRect = _GUICtrlListView_GetItemRect($hListView, $sItemIndex, 2)
    Else
    $aRect = _GUICtrlListView_GetSubItemRect($hListView, $sItemIndex, $sSubItemIndex)
    EndIf

    If $aRect[1] < 10 Then
    _WinAPI_ShowWindow($hProgress, $SW_HIDE)
    ElseIf $aRect[1] >= 10 Then
    _WinAPI_ShowWindow($hProgress, $SW_SHOW)
    EndIf

    _WinAPI_MoveWindow($hProgress, $aRect[0] + 6, $aRect[1] + 2, ($aRect[2] - $aRect[0]) - 12, ($aRect[3] - $aRect[1]) - 4, True)
    EndFunc ;==>_MoveEdit

    [/autoit]

    Danke für eure Mühen!

    2 Mal editiert, zuletzt von Trolleule1337 (2. Juli 2013 um 22:53)

  • Hab den Code aktualisiert: Ich kann jetzt zwar scrollen, aber nur durch klicken auf die pfeile, beim schnellen scrollen kommt er mit der richtigen Anzeige nicht mehr mit, also die Reihenfolge der Edits stimmt nicht mehr. Mir ist auch aufgefallen, das nur beim einfachen Mouse Hover über die Edit Controls, DrawItem ausgelöst wird, warum ist das so? Und das schreiben in den Edit Controls führt zum Absturz je nachdem wie ungeschickt man danach ins Listview Control klickt. Hat jemand ne idee?