#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 ( bugfix@autoit.de )
;===============================================================================
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