ListView: fixe Spaltenbreite

  • Hallo Gemeinde,

    ich programmiere gerade an einem IRC-Clienten auf Grundlage eines Snippets von BugFix in diesem Forum (ich hab Urlaub *g*) - Soweit funktioniert das ganze bisher auch wunderbar.

    Es werden zwei Listviews für die Anzeige des Chatsgeschehens und für die Benutzerliste des Raumes verwendet. Nun möchte ich gern, dass Anwender die Spaltenbreite nicht verändern können (weder verkleinern, noch vergrößern.) Bisher fand ich leider nichts dazu, außer der Möglichkeit die Spalten in der Breite zu ändern, aber nicht zu sperren:

    [autoit]

    _GUICtrlListView_SetColumnWidth()

    [/autoit]

    Gibt es eine Möglichkeit die Spalten zu sperren?

    Vielen Dank :)

    Jens

  • [autoit]

    $hHeader = HWnd(_GUICtrlListView_GetHeader($hListView))
    ControlDisable($hGUI, "", $hHeader)

    [/autoit]
    • Offizieller Beitrag

    Der Style $LVS_EX_FIXCOLUMNWIDTH = 0x400 steht in AutoIt leider nicht zur Verfügung.
    Aber du kannst es so machen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

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

    $gui = GUICreate('test')
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 146)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
    For $i = 1 To 10
    GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
    Next

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

    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case -12
    _GUICtrlListView_SetColumnWidth($hListView, 0, 146)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

    @ ChaosKeks: Deine Variante hat den Nachteil, dass die Spaltenbutton nicht mehr für Sortiervorgänge verfügbar sind.

  • oder den Header verstecken ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

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

    $gui = GUICreate('test')
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_NOCOLUMNHEADER) )
    _GUICtrlListView_SetColumnWidth($hListView, 0, 146)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
    For $i = 1 To 10
    GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
    Next

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

    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

    [/autoit]


    und die von ChaosKeks vorgeschlagene Lösung funktioniert auch, wenn nicht sortiert werden soll:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

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

    $gui = GUICreate('test')
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200 )
    _GUICtrlListView_SetColumnWidth($hListView, 0, 146)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)

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

    $hHeader = HWnd(_GUICtrlListView_GetHeader($hListView))
    ControlDisable($hHeader,"","")

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

    For $i = 1 To 10
    GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
    Next

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

    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

    [/autoit]

    Ein Chatverlauf soll glaube ich auch nicht sortiert werden ;)

  • [autoit]

    $hHeader = HWnd(_GUICtrlListView_GetHeader($hListView))
    ControlDisable($hGUI, "", $hHeader)

    [/autoit]

    Arbeitet perfekt, vielen Dank :)

    Ansonsten stimmt natürlich die These: Sortiert werden soll der Inhalt des Chat-Geschehens nicht. Die Benutzerliste wird vom Script selbst von A-Z sortiert.

    Ich habe zwar noch nicht die Suche beschäftigt, aber erlaubt mir evtl. auch so die Frage: Ist es möglich die Ausgabe des Listview-Items auf mehrere Zeilen zu spalten ohne eine eigene UDF zu basteln.

    Ich hatte das ganze damals bereits in VB6 umgesetzt und konnte dort das Item zum Umbruch bringen. Gleichzeitig waren auch mehrere Icons pro Zeile an verschiedenen Stellen möglich, dies scheint bei AutoIT aber nicht der Fall, oder?

    Danke :)

    Jens


  • Ich hatte das ganze damals bereits in VB6 umgesetzt und konnte dort das Item zum Umbruch bringen. Gleichzeitig waren auch mehrere Icons pro Zeile an verschiedenen Stellen möglich, dies scheint bei AutoIT aber nicht der Fall, oder?


    Nöh, geht nich.. noch nicht :P

  • Ich hatte das ganze damals bereits in VB6 umgesetzt und konnte dort das Item zum Umbruch bringen. Gleichzeitig waren auch mehrere Icons pro Zeile an verschiedenen Stellen möglich, dies scheint bei AutoIT aber nicht der Fall, oder?

    Ich würde fast auf eine IE-Objekt umstellen (_IECreateEmbedded) ;) Dann kannst du alles mit HTML frei definieren.

  • Die Idee ist nicht schlecht und dürfte die Probleme der Smiley-Darstellung + Umbruch sicherlich lösen.

    Die Frage ist nur, wie verhält sich das Objekt beim update()? Flackert es, Verzögerungen? Ich hab mit dem Embedded bisher noch nicht gearbeitet.

    Bisher schaut das ganze so aus:

    [Blockierte Grafik: http://www.svwilhelmshaven.de/chat_irc_autoit.png]

  • Schau dir z.B. den ShoutBox Chat an ;) Da wird ein IE verwendet.

    Das sieht perfekt aus, ich denke damit lässt sich was feines basteln :)

    @Miranda: Du wirst sicherlich die History++ in Verbindung mit der IEView.dll meinen - ja, das sieht schick aus :)

    Danke dir.

  • Hallo Jungs,

    ich bin es noch einmal ;)

    Also, erstmal ein kleines Feedback: Es hat wunderbar mit dem EmbeddedIE funktioniert. Die Ausgabe lässt sich via CSS und einfachen HTML-Befehlen sehr individuell gestalten und smileys, etc steht auch nichts mehr im Wege :)

    Während der Programmierung sind mir nun noch zwei Dinge aufgefallen, zu denen ich bisher leider keine Antwort gefunden hab, evtl. wisst ihr hier mehr?

    1. Wenn ich die Listview (Benutzerliste) aktualisieren lasse, z.b. mit 100 Einträgen, kommt es zu einem unschönen flackern. Ist es möglich dies zu unterdrücken?
    2. Die Listview scheint mit einigen Zeichen Probleme zu haben. So werden beim ersten befüllen der Listview z.b. Namen mit einem | oder ^ (Bsp: jenster|afk oder ^jensster^) gar nicht dargestellt oder am entsprechenden Zeichen abgeschnitten. Beim zweiten Neubefüllen werden aber alle korrekt dargestellt. Ich habe keinerlei Funktionen für StringSplit oder ähnliches im Einsatz (zumindest an diesem Punkt)

    Grüße & Danke

    Jens