- Offizieller Beitrag
Hi,
da ich normalerweise Treeview mit GuiCtrlCreateTreeView erstelle, ist mir dieses Verhalten noch nie aufgefallen.
Testet bitte mal das Bsp-Skript, ob ihr dasselbe Verhalten habt.
- Im ersten Fall wird das Treeview mit _GuiCtrlTreeView_Create erstellt. DrawStage ist dann immer $CDDS_PREPAINT und ein Ändern der Strukturparameter führt zu keiner Reaktion.
- Im zweiten Fall erstelle ich das Treeview mit GuiCtrlCreateTreeView. Da aus der Struktur $CDDS_ITEMPREPAINT als DrawStage richtig erkannt wird, führt auch das Setzen der Strukturparameter zum gewünschten Ergebnis: "Item_[02]" wird ausgegraut dargestellt.
Ein weiteres Verhalten ist auffällig: Die Höhe der Item ist bei _GuiCtrlTreeView_Create sichtbar kleiner als bei GuiCtrlCreateTreeView.
Spoiler anzeigen
#Include <GUIConstantsEx.au3>
#Include <GuiTreeView.au3>
#Include <WindowsConstants.au3>
Global Const $__TVITEM_DISABLE = 2001
Global $hTreeView1, $hTreeView2
_Main()
[/autoit] [autoit][/autoit] [autoit]Func _Main()
Local $hGUI, $aItem[8], $nTreeView
$hGUI = GUICreate("TreeView Create [_GUICtrlTreeView_Create]", 400, 300)
$hTreeView1 = _GUICtrlTreeView_Create($hGUI, 2, 2, 396, 268, BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
[/autoit] [autoit][/autoit] [autoit]_GUICtrlTreeView_BeginUpdate($hTreeView1)
For $i = 0 To 7
$aItem[$i] = _GUICtrlTreeView_Add($hTreeView1, 0, StringFormat("Item_[%02d]", $i))
Next
_GUICtrlTreeView_EndUpdate($hTreeView1)
_GUICtrlTreeView_SetItemParam($hTreeView1, $aItem[2], $__TVITEM_DISABLE)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
; =========================================================================
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate("TreeView Create [GUICtrlCreateTreeView]", 400, 300)
$nTreeView = GUICtrlCreateTreeView(2, 2, 396, 268, BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)
$hTreeView2 = GUICtrlGetHandle($nTreeView)
GUISetState()
_GUICtrlTreeView_BeginUpdate($hTreeView2)
For $i = 0 To 7
$aItem[$i] = _GUICtrlTreeView_Add($hTreeView2, 0, StringFormat("Item_[%02d]", $i))
Next
_GUICtrlTreeView_EndUpdate($hTreeView2)
_GUICtrlTreeView_SetItemParam($hTreeView2, $aItem[2], $__TVITEM_DISABLE)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>_Main
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hTreeView1, $hTreeView2
Switch $iCode
Case $NM_CUSTOMDRAW
Local $tCustDraw = DllStructCreate($tagNMTVCUSTOMDRAW, $ilParam)
ConsoleWrite('DrawStage: ' & DllStructGetData($tCustDraw, 'DrawStage') & @TAB & ' 1=$CDDS_PREPAINT / 65537=$CDDS_ITEMPREPAINT' & @CRLF)
Switch DllStructGetData($tCustDraw, 'DrawStage')
Case $CDDS_ITEMPREPAINT
If DllStructGetData($tCustDraw, 'ItemParam') = $__TVITEM_DISABLE Then
DllStructSetData($tCustDraw, 'ClrText', 0xA0A0A0)
DllStructSetData($tCustDraw, 'ItemState', BitOR($CDIS_GRAYED,$CDIS_DISABLED))
Else
DllStructSetData($tCustDraw, 'ItemState', $CDIS_DEFAULT)
EndIf
EndSwitch
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Ich vermute, dass das $tagNMTVCUSTOMDRAW nur mit nativ erstellten Treeview korrekt funktioniert, obwohl ich keinen sinnvollen Grund sehe, dass es mit der UDF-Funktion nicht geht.