- 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)
#Region - TimeStamp
; 2011-10-25 20:39:12 v 1.0
#EndRegion - TimeStamp
#include-once
#include <GuiListView.au3>
#include <HeaderConstants.au3>
#include <ListViewConstants.au3>
#include <SendMessage.au3>
;===============================================================================
; 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