Spalte im Listview nach maximieren ändern

  • Hallo,

    ich bins wieder. Ich verzweifel langsam. Ich möchte nur das bei einer Größenänderung die letzte Spalte vom Listview angepasst wird. Das passiert bis jetzt nur wenn ich die Größe selber mit der Maus verändern, aber es will nicht wenn ich es maximier bzw. wiederherstelle.

    Spoiler anzeigen
    [autoit]

    GUIRegisterMsg($WM_GETMINMAXINFO, "WM_COMMAND")
    GUIRegisterMsg($WM_SIZE, "WM_COMMAND")
    GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_COMMAND")

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

    ...

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

    Global $cListview = GUICtrlCreateListView("PDD|Data Type|Value", 10, 60, 580, 315, -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM)
    For $i = 1 To UBound($aPPOs) - 1
    $cItem = GUICtrlCreateListViewItem($aPPOs[$i][0] & "|" & $aPPOs[$i][1], $cListview)
    $cContextMenu = GUICtrlCreateContextMenu($cItem)
    GUICtrlCreateMenuItem("Set", $cContextMenu)
    GUICtrlSetOnEvent(-1, "_SetVar")
    Next
    _GUICtrlListView_SetColumnWidth($cListview, 0, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($cListview, 1, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($cListview, 2, $LVSCW_AUTOSIZE_USEHEADER)

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

    ...

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode

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

    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam,0xFFFF)
    $iCode = BitShift($iwParam,16)

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

    Switch $hWnd
    Case $hGui
    Switch $iMsg
    Case $WM_GETMINMAXINFO
    $strMinMax = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $ilParam)
    DllStructSetData($strMinMax, 7, 600 + 8)
    DllStructSetData($strMinMax, 8, 400 + 34)
    DllStructSetData($strMinMax, 9, @DesktopWidth)
    DllStructSetData($strMinMax, 10, @DesktopHeight)
    Case $WM_SIZE, $WM_EXITSIZEMOVE
    _GUICtrlListView_SetColumnWidth($cListview, 2, $LVSCW_AUTOSIZE_USEHEADER)
    EndSwitch
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Fehlt da noch was?
    Nach Maximieren wird doch eine WM_SIZE versendet. ?(

  • Also irgendwie hab ich es jetzt. Unter Vista siehts gut aus, aber bei XP nicht. Da aktualisiert er nicht die Spaltenbreite.

    Nun flackert es aber auch noch, wenn ich mit der Maus manuell die Größe veränder.
    Was kann man da machen?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <String.au3>
    #include <WinHttp.au3>
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <GUIComboBox.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $sLine, $aPPOs[1][2], $aSS, $hTimer
    Global $sTitle = "ILC PDD Request"

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

    ;~ If Not FileExists(@ScriptDir & "\PDD.csv") Then
    ;~ MsgBox(48, $sTitle & " - Error", "Can't find PDD.csv.")
    ;~ Exit
    ;~ EndIf

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

    Global $hFile = FileOpen(@ScriptDir & "\PDD.csv")

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

    While 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop
    $aSS = StringSplit($sLine, ",")
    $aPPOs[UBound($aPPOs) - 1][0] = $aSS[1]
    $aPPOs[UBound($aPPOs) - 1][1] = $aSS[2]
    ReDim $aPPOs[UBound($aPPOs) + 1][2]
    Wend

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

    FileClose($hFile)
    _ArrayDelete($aPPOs, UBound($aPPOs))

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

    Global $hGui = GUICreate($sTitle, 600, 400, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
    GUICtrlCreateLabel("ILC IP-Address:", 20, 25, 80, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cIP = GUICtrlCreateInput("192.168.0.2", 100, 22, 90, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cRequest = GUICtrlCreateButton("Request", 220, 20, 80, 25)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cAutoRequest = GUICtrlCreateCheckbox("Auto Request", 320, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    GUICtrlCreateLabel("Update Time:", 420, 25, 80, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cUpdateTime = GUICtrlCreateCombo("100", 490, 22, 50, 20, $CBS_DROPDOWNLIST)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    GUICtrlSetData(-1, "200|300|400|500|1000")
    GUICtrlCreateLabel("ms", 545, 25, 20, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    Global $cListview = GUICtrlCreateListView("PDD|Data Type|Value", 10, 60, 580, 315, -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM)
    For $i = 1 To UBound($aPPOs) - 1
    $cItem = GUICtrlCreateListViewItem($aPPOs[$i][0] & "|" & $aPPOs[$i][1], $cListview)
    $cContextMenu = GUICtrlCreateContextMenu($cItem)
    GUICtrlCreateMenuItem("Set", $cContextMenu)
    GUICtrlSetOnEvent(-1, "_SetVar")
    Next
    _GUICtrlListView_SetColumnWidth($cListview, 0, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($cListview, 1, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($cListview, 2, $LVSCW_AUTOSIZE_USEHEADER)
    GUICtrlCreateLabel("Real Update Time:", 20, 380, 100, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    $cUpdateTimeReal = GUICtrlCreateLabel("", 115, 380, 80, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    GUISetState()

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

    GUIRegisterMsg($WM_GETMINMAXINFO, "WM_COMMAND")
    GUIRegisterMsg($WM_SIZE, "WM_COMMAND")
    ;~ GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_COMMAND")

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_RESIZED, "_Size")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "_Size")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_Size")
    GUICtrlSetOnEvent($cRequest, "_GetValues")
    GUICtrlSetOnEvent($cAutoRequest, "_AutoRequest")

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

    While 1
    Sleep(20)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _AutoRequest()
    $hTimer = ""
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($cIP, $GUI_DISABLE)
    GUICtrlSetState($cRequest, $GUI_DISABLE)
    GUICtrlSetState($cUpdateTime, $GUI_DISABLE)
    AdlibRegister("_GetValues", Int(GUICtrlRead($cUpdateTime)))
    Else
    GUICtrlSetState($cIP, $GUI_ENABLE)
    GUICtrlSetState($cRequest, $GUI_ENABLE)
    GUICtrlSetState($cUpdateTime, $GUI_ENABLE)
    AdlibUnRegister("_GetValues")
    EndIf
    EndFunc

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

    Func _GetValues()

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

    Local $aValues, $sXML, $sXMLResponse, $iTime, $iIndex

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

    If $hTimer <> "" Then
    $iTime = Round(TimerDiff($hTimer))
    GUICtrlSetData($cUpdateTimeReal, $iTime & " ms")
    If $iTime > Int(GUICtrlRead($cUpdateTime)) + 20 Then
    $iTime = Int(GUICtrlRead($cUpdateTime))
    While 1
    $iTime += 100
    $iIndex = _GUICtrlComboBox_SelectString($cUpdateTime, String($iTime))
    If $iIndex <> -1 Then ExitLoop
    WEnd
    AdlibUnRegister("_GetValues")
    AdlibRegister("_GetValues", Int(GUICtrlRead($cUpdateTime)))
    EndIf
    EndIf
    $hTimer = TimerInit()
    $sXML = _CreateXMLString($aPPOs)
    Local $hTimer1 = TimerInit()
    $sXMLResponse = _SendHTTPRequest(GUICtrlRead($cIP), $sXML)
    ConsoleWrite(TimerDiff($hTimer1) & @CRLF)
    If @error Then Return SetError(1)
    $aValues = _StringBetween($sXMLResponse, "</n><v>", "</v></i>")

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

    If Not @error Then
    _GUICtrlListView_BeginUpdate($cListview)
    For $i = 1 To UBound($aPPOs) - 1
    If _GUICtrlListView_GetItemText($cListview, $i - 1, 2) <> $aValues[$i - 1] Then
    _GUICtrlListView_SetItemText($cListview, $i - 1, $aValues[$i - 1], 2)
    EndIf
    Next
    _GUICtrlListView_EndUpdate($cListview)
    EndIf

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

    EndFunc

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

    Func _SetVar()
    Local $sValue, $sDataType
    Local $aSelectedItems = _GUICtrlListView_GetSelectedIndices($cListview, 1)

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

    If $aSelectedItems[0] = 1 Then
    $sDataType = _GUICtrlListView_GetItemText($cListview, $aSelectedItems[1], 1)
    Switch $sDataType
    Case "BOOL"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return 0
    If $sValue = "true" Then $sValue = "1"
    If $sValue = "false" Then $sValue = "0"
    If $sValue = "1" Or $sValue = "0" Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case "DINT"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return 0
    If Int($sValue) >= -2147483648 And Int($sValue) <= 2147483647 And StringIsInt($sValue) Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case "INT"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return 0
    If Int($sValue) >= -32768 And Int($sValue) <= 32767 And StringIsInt($sValue) Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case "STRING(80)"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return 0
    If StringLen($sValue) <= 80 Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case "WORD"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return
    If StringInStr($sValue, "2#") Then
    $sValue = StringTrimLeft($sValue, 2)
    $sValue = Dec(_BinToHex($sValue))
    EndIf
    If StringInStr($sValue, "16#") And StringIsXDigit(StringTrimLeft($sValue, 3)) Then
    $sValue = StringTrimLeft($sValue, 3)
    $sValue = Dec($sValue)
    EndIf
    If Int($sValue) >= 0 And Int($sValue) <= 65535 And StringIsInt($sValue) Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case Else
    MsgBox(48, $sTitle & " - Error", "Data type not supported. Please contact the developer.", 0, $hGui)
    Return SetError(1)
    EndSwitch
    _SendHTTPRequest(GUICtrlRead($cIP), "","Write", _GUICtrlListView_GetItemText($cListview, $aSelectedItems[1], 0), $sValue)
    If @error Then Return SetError(2)
    _GetValues()
    EndIf
    EndFunc

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

    Func _BinToHex($sBin)
    Local $sHex, $iDec, $iLen = StringLen($sBin)
    For $i = $iLen To 1 Step -1
    $iDec += 2 ^ ($iLen - $i) * StringMid($sBin, $i, 1)
    Next
    $iLen = Ceiling($iLen / 4)
    $sHex = StringRegExpReplace(Hex(Int($iDec)), '0*(.+)', '$1')
    For $i = 1 To $iLen
    $sHex = "0" & $sHex
    Next
    Return StringRight($sHex, $iLen)
    EndFunc ;==>_BinToHex

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

    Func _CreateXMLString($aVars)
    Local $sXML

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

    $sXML = "<body><version>1.0</version><client>IMasterPhoenix5_14_05</client><client_ver>5.14.0501</client_ver><item_list_size>" & UBound($aVars)
    $sXML &= "</item_list_size><item_list>"

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

    For $i = 1 To UBound($aVars) - 1
    $sXML &= "<i><n>" & $aVars[$i][0] & "</n></i>"
    Next

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

    $sXML &= "</item_list></body>"

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

    Return $sXML
    EndFunc

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

    Func _SendHTTPRequest($sIP, $sXML = "",$sCommand = "Read", $sVar = "", $sValue = "")
    Local $sData, $sRet, $sVerb, $sObjectName
    Local $hOpen = _WinHttpOpen()
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error initializing the usage of WinHTTP functions.", 0, $hGui)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(1)
    EndIf

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

    Local $hConnect = _WinHttpConnect($hOpen, $sIP)
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error specifying the initial target server of an HTTP request. (Error: " & _WinAPI_GetLastError() & ")", 0, $hGui)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(2)
    EndIf

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

    Switch $sCommand
    Case "Read"
    $sVerb = "POST"
    $sObjectName = "/cgi-bin/ILRReadValues.exe"
    Case "Write"
    $sVerb = "GET"
    $sObjectName = "/cgi-bin/writeVal.exe?" & $sVar & "+" & $sValue
    Case Else
    Return SetError(7)
    EndSwitch

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

    Local $hRequest = _WinHttpOpenRequest($hConnect, $sVerb, $sObjectName, "HTTP/1.0")
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error creating an HTTP request handle.", 0, $hGui)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(3)
    EndIf

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

    _WinHttpSendRequest($hRequest, Default, $sXML)
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error sending specified request.", 0, $hGui)
    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(4)
    EndIf
    _WinHttpReceiveResponse($hRequest)
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error waiting for the response from the server.", 0, $hGui)
    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(5)
    EndIf
    If _WinHttpQueryDataAvailable($hRequest) Then
    While 1
    $sData = _WinHttpReadData($hRequest)
    If @error Then ExitLoop
    $sRet &= $sData
    WEnd
    Else
    MsgBox(48, $sTitle & " - Error", "Site is experiencing problems.", 0, $hGui)
    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(6)
    EndIf

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

    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)

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

    Return $sRet
    EndFunc

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

    Func _Size()
    _GUICtrlListView_SetColumnWidth($cListview, 2, $LVSCW_AUTOSIZE_USEHEADER)
    EndFunc

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode

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

    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam,0xFFFF)
    $iCode = BitShift($iwParam,16)

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

    Switch $hWnd
    Case $hGui
    Switch $iMsg
    Case $WM_GETMINMAXINFO
    $strMinMax = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $ilParam)
    DllStructSetData($strMinMax, 7, 600 + 8)
    DllStructSetData($strMinMax, 8, 400 + 34)
    DllStructSetData($strMinMax, 9, @DesktopWidth)
    DllStructSetData($strMinMax, 10, @DesktopHeight)
    Case $WM_SIZE
    _GUICtrlListView_SetColumnWidth($cListview, 2, $LVSCW_AUTOSIZE_USEHEADER)
    EndSwitch
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]