Hallo!
Ich hab hier eine Funktion, die bei mir auf WinXP (klassischer und XP-Style einigermaßen gut funktioniert). Ich habe aber berechtigten Zweifel, dass es unter Vista und Win7 noch so stimmt.
Die Funktion _GuiCtrlListView_MarkItem umrandet einfach ein SubItem einer ListView, nur leider sollen auf einigen Systemen die Koordinaten nicht passen, sodass das Quadrat nicht schön über dem SubItem gezeichnet wird. Ich hätte aber natürlich gerne, dass es überall System- und Style-unabhängig gleich gut funktioniert.
Vielen Dank für eure Hilfe!
[autoit]#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>
#Include <WinAPI.au3>
Opt('MustDeclareVars', 1)
[/autoit][autoit][/autoit][autoit]Example()
[/autoit][autoit][/autoit][autoit]Func Example()
Local $hGui, $listview, $button, $item1, $item2, $item3, $item4, $item5, $input1, $msg
$hGui = GUICreate("listview items", 220, 250, 100, 200)
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150, -1, 0x21)
$button = GUICtrlCreateButton("Click Me!!!!", 75, 170, 70, 20)
$item1 = GUICtrlCreateListViewItem("item1|col12|col13", $listview)
$item2 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
$item4 = GUICtrlCreateListViewItem("item4|col42|col43", $listview)
$item5 = GUICtrlCreateListViewItem("item5|col52|col53", $listview)
GUISetState()
Do
$msg = GUIGetMsg()
Select
Case $msg = $button
_GuiCtrlListView_MarkItem($hGui, $listview, Random(0,4,1), Random(0,2,1))
EndSelect
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example
Func _GuiCtrlListView_MarkItem($hWndGui, $hWnd, $iIndex, $iSubItem, $Color = 0xFF, $Redraw = 1)
;funkey April 16, 2010
Local $aPos, $aRect, $aMenu, $aBorder, $aBorder3D, $aWndSize, $aWndClientSize, $Offset, $iSum = 0
Local $x, $y, $w, $h
For $i = 0 To $iSubItem - 1
$iSum += _GUICtrlListView_GetColumnWidth($hWnd, $i)
Next
$aWndSize = WinGetPos($hWndGui)
$aWndClientSize = WinGetClientSize($hWndGui)
$aBorder = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 6) ;SM_CYBORDER
$aBorder3D = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 46) ;SM_CYEDGE
;~ ConsoleWrite("Border: " & $aBorder[0] & @CR)
;~ ConsoleWrite("Border3D: " & $aBorder3D[0] & @CR)
;~ ConsoleWrite("ClientDiff: " & ($aWndSize[2] - $aWndClientSize[0]) / 2 & @CR)
$Offset = $aWndSize[3] - $aWndClientSize[1]
$aRect = _GUICtrlListView_GetItemRect($hWnd, $iIndex)
$aPos = ControlGetPos($hWndGui, "", $hWnd)
$x = $iSum + $aPos[0] + $aRect[0] + ($aWndSize[2] - $aWndClientSize[0]) / 2 + $aBorder3D[0] + $aBorder[0]
$y = $aPos[1] + $aRect[1] + $Offset
$w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
$h = $aRect[3] - $aRect[1]
If $Redraw Then _WinAPI_RedrawWindow($hWndGui)
[/autoit][autoit][/autoit][autoit]Local $hDC, $hPen, $obj_orig
$hDC = _WinAPI_GetWindowDC($hWndGui)
$hPen = _WinAPI_CreatePen($PS_SOLID, 2, $Color)
$obj_orig = _WinAPI_SelectObject($hDC, $hPen)
_WinAPI_DrawLine($hDC, $x, $y, $x + $w, $y)
_WinAPI_DrawLine($hDC, $x, $y, $x, $y + $h)
_WinAPI_DrawLine($hDC, $x + $w, $y, $x + $w, $y + $h)
_WinAPI_DrawLine($hDC, $x, $y + $h, $x + $w, $y + $h)
; clear resources
_WinAPI_SelectObject($hDC, $obj_orig)
_WinAPI_DeleteObject($hPen)
_WinAPI_ReleaseDC($hWndGui, $hDC)
EndFunc ;==>ShowCross