Listview Spalten fixieren - jetzt als Funktion

    • Offizieller Beitrag

    Hi,
    über den Umweg Messageauswertung gibt es ja einen Workaround beim Ändern der Spaltenbreite sofort wieder die Originalbreite zu setzen.

    In der Funktion nutze ich jetzt die ab Vista verfügbare Möglichkeit, ein Flag zum Fixieren der Spaltenbreite zu setzen (oder auch wieder zu löschen).
    Es können wahlweise alle Spalten fixiert werden (Standard) oder einzelne.
    Die Funktion kann mit ID oder Handle des Listview aufgerufen werden.

    _GuiCtrlListView_HeaderItemFix(1.0)
    [autoit]

    #Region - TimeStamp
    ; 2011-10-25 20:39:12 v 1.0
    #EndRegion - TimeStamp

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

    #include-once
    #include <GuiListView.au3>
    #include <HeaderConstants.au3>
    #include <ListViewConstants.au3>
    #include <SendMessage.au3>

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

    ;===============================================================================
    ; Function Name....: _GuiCtrlListView_HeaderItemFix
    ; Description......: Fixiert die Spaltenbreite im Listview für eine oder alle Spalten, der User kann diese nicht ändern
    ; Fixierung läßt sich wieder aufheben
    ; Parameter(s).....: $hWnd Handle/ID des Listview
    ; $iItemIndex 0-basierter SpaltenIndex (-1 Standard, wird für alle Spalten ausgeführt)
    ; $fFixWidth 1 - Standard, Fixierung setzen; 0 - Fixierung aufheben
    ; Requirement(s)...: OS Vista oder höher
    ; Return Value(s)..: Fehler @error Spaltenindex größer als Maximalwert
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GuiCtrlListView_HeaderItemFix($hWnd, $iItemIndex=-1, $fFixWidth=1)
    If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
    Local $hHeader = _SendMessage($hWnd, $LVM_GETHEADER)
    Local $iColumn = _SendMessage($hHeader, $HDM_GETITEMCOUNT)
    Local $iFrom = $iItemIndex, $iTo = $iItemIndex, $iFmt
    If $iItemIndex < 0 Then
    $iFrom = 0
    $iTo = $iColumn -1
    EndIf
    If $iItemIndex > $iColumn -1 Then Return SetError(1,0,-1)
    Local Const $_HDM_GETITEM = 0x120B
    Local Const $_HDM_SETITEM = 0x120C
    Local Const $_HDF_FIXEDWIDTH = 0x0100
    Local $HDITEM = DllStructCreate('uint mask;int cxy;ptr pszText;hwnd hbm;int cchTextMax;int fmt;lparam LPARAM;int iImage;int iOrder;uint type;int_ptr pvFilter;uint state;')
    DllStructSetData($HDITEM, 'mask', BitOR($HDI_FORMAT,$HDI_FILTER,$HDI_TEXT))
    DllStructSetData($HDITEM, 'cchTextMax', 260)
    Local $pszText = DllStructCreate('char[260];')
    If _GUICtrlListView_GetUnicodeFormat($hWnd) Then $pszText = DllStructCreate('wchar[260];')
    DllStructSetData($HDITEM, 'pszText', DllStructGetPtr($pszText))
    For $i = $iFrom To $iTo
    If $fFixWidth Then
    _SendMessage($hHeader, $_HDM_GETITEM, $i, DllStructGetPtr($HDITEM))
    $iFmt = BitOR(DllStructGetData($HDITEM, 'fmt'), BitOR($HDF_OWNERDRAW,$HDF_STRING,$_HDF_FIXEDWIDTH))
    DllStructSetData($HDITEM, 'fmt', $iFmt)
    _SendMessage($hHeader, $_HDM_SETITEM, $i, DllStructGetPtr($HDITEM))
    Else
    _SendMessage($hHeader, $_HDM_GETITEM, $i, DllStructGetPtr($HDITEM))
    $iFmt = DllStructGetData($HDITEM, 'fmt')
    If BitAND($iFmt, $_HDF_FIXEDWIDTH) Then $iFmt = BitXOR($iFmt, $_HDF_FIXEDWIDTH)
    DllStructSetData($HDITEM, 'fmt', $iFmt)
    _SendMessage($hHeader, $_HDM_SETITEM, $i, DllStructGetPtr($HDITEM))
    EndIf
    Next
    EndFunc ;==>_GuiCtrlListView_HeaderItemFix

    [/autoit]
  • Hi,

    ich wollte das gerne in einem aktuellen Projekt nutzen. Aber die Spalten sind trotzdem nicht fix.

    • Offizieller Beitrag

    @m-obi
    Es gibt auch eine nicht so Anspruchsvolle Lösung.

    1. Du brauchst das Handle des ListviewHeaders

    [autoit]

    Global $hHeaderLV = _GUICtrlListView_GetHeader($hListView)

    [/autoit]

    2. Du mußt WM_NOTIFY registrieren

    [autoit]

    GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

    [/autoit]

    3.Die WM_NOTIFY Funktion anpassen

    [autoit]

    Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    Local $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    ;============= Resizen des LV Headers verhindern ==========================
    Case $hHeaderLV
    Switch $iCode
    Case -320, -321 ; -320 = $HDN_ITEMCHANGINGW -321 = $HDN_ITEMCHANGEDW
    Return 1
    EndSwitch
    ;============= /Resizen des LV Headers verhindern ==========================
    .....

    [/autoit]