- Offizieller Beitrag
Hi,
ich suche nach einer Möglichkeit direkt mit dem Klick (oder De-/Aktivieren per Spacebar) festzustellen ob eine Checkbox im Listview-Item gecheckt ist oder nicht. Dazu ist der Index des Listview-Item erforderlich.
Wenn das Item selektiert ist, ist das kein Problem - aber ein Klick auf eine Checkbox eines nicht selektierten Item führt nicht zu dessen Selektion.
Laut MSDN soll mit Senden der "LVM_HITTEST" Message der Index des Items, in dessen Bereich geklickt wurde ermittelt werden können. Ich habe das in folgendem Bsp.Skript mal nachvollzogen - aber als Index erhalte ich immer 0.
Bitte keine evtl. Lösungsvorschläge, wie man das anders lösen könnte (es gibt keine wirklich sinnvollen - nur riesig aufgeblähte Workarounds über sechs Ecken).
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>
$hGui = GUICreate('test')
$hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200, BitOR($LVS_SHOWSELALWAYS,$LVS_REPORT), BitOR($LVS_EX_CHECKBOXES,$LVS_EX_FULLROWSELECT))
_GUICtrlListView_SetColumnWidth($hListView, 0, 146)
_GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
For $i = 1 To 10
GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
If $hWndFrom = $hWndListView Then
Switch $iCode
Case $LVN_ITEMCHANGED ; == Item geändert
Local $old = Opt('MouseCoordMode', 2), $aPos = MouseGetPos(), $tPOINT = DllStructCreate($tagPOINT)
Opt('MouseCoordMode', $old)
DllStructSetData($tPOINT, 1, $aPos[0])
DllStructSetData($tPOINT, 2, $aPos[1])
Local $tITEM = DllStructCreate('struct; int; endstruct'), $tLVHITTESTINFO = DllStructCreate($tagLVHITTESTINFO)
DllStructSetData($tLVHITTESTINFO, 1, DllStructGetPtr($tPOINT)) ; == Mauskoordinaten im Client
DllStructSetData($tLVHITTESTINFO, 'Flags', $LVHT_ONITEMSTATEICON) ; == Flag für "The position is over the state image of a list-view item"
DllStructSetData($tLVHITTESTINFO, 'Item', DllStructGetPtr($tITEM)) ; == Rückgabewert Listview Item-Index
; == LVM_HITTEST Message senden ( http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx )
Local $ret = DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGui, "uint", $LVM_HITTEST, "wparam", 0, "lparam", DllStructGetPtr($tLVHITTESTINFO))
;~ ConsoleWrite($ret[0] & ' err: ' & @error & @LF)
ConsoleWrite('Index changed = ' & DllStructGetData($tITEM, 1) & @LF)
EndSwitch
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY