_GuiCtrlTreeView_Create -- $tagNMTVCUSTOMDRAW fehlerhaft?

    • 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
    [autoit]

    #Include <GUIConstantsEx.au3>
    #Include <GuiTreeView.au3>
    #Include <WindowsConstants.au3>

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

    Global Const $__TVITEM_DISABLE = 2001
    Global $hTreeView1, $hTreeView2

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

    _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()

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

    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)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()

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

    ; =========================================================================

    [/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()

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

    _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)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
    EndFunc ;==>_Main

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

    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

    [/autoit]


    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.

  • Hi,
    selbes Verhalten bei XP32/Win7-64

    Zitat

    Ein weiteres Verhalten ist auffällig: Die Höhe der Item ist bei _GuiCtrlTreeView_Create sichtbar kleiner als bei GuiCtrlCreateTreeView.

    Das ist bei XP32 NICHT so!

    Allerdings habe ich in einem anderen Zusammenhang schon unterschiedliche Zeilenhöhen festgestellt. Auch bei ListViews gibt es eklatante Höhen- und Breitenunterschiede (bei identischen Schriften/Größen) zwischen XP und Win7, was dazu führt, dass Scrollbalken in Win7-ListViews eingefügt werden :cursing:

    • Offizieller Beitrag

    Ist das ein Rotz. Wie soll man da allgemeingültige Funktionen schreiben? ;(
    Ich bastel gerade an: _GuiCtrlTreeView_ItemDisable($hWnd$hItem$fDisable=True)

    Dazu muß aber die Struktur NMTVCUSTOMDRAW verwendet werden, ansonsten geht das in die Hose.

    Was ich auch nicht verstehe, warum die Zeile:

    [autoit]

    DllStructSetData($tCustDraw, 'ItemState', BitOR($CDIS_GRAYED,$CDIS_DISABLED))

    [/autoit]

    auf das Zeichnen des Item-Text keinen Einfluß hat. Nur wenn ein Image zugeordnet ist, wird dieses dadurch ausgegraut. Nun gut, die Textfarbe läßt sich ja setzen für das Item, aber ein automatisches Setzen in Verbindung mit dem Flag erschiene mir eigentlich logisch. :whistling: