Bei GUICtrlCreateListView Spalten verschieden Makieren (zB 1.Spalte links, 5.Spalte rechts)

  • Hey
    Ich möchte ein ListView erstellen, mitdem man, wenn man zB 2 Spalten hat, diese unabhängig voneinander makieren kann (1.Spalte links, 5.Spalte rechts und nicht 2.Spalte links, 2.Spalte rechts).
    Bis jetzt habe ich dazu nichts gefunden.
    Währe nett wenn ihr mir helft :thumbup:
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von AntiSpeed (5. Februar 2011 um 20:40)

    • Offizieller Beitrag

    Davon habe ich noch nie etwas gehört und meines Wissens beherscht ein Listview dieses Verhalten nicht.

    Erstelle dir eine Lösung mit 2 Listviews und setze sie direkt nebeneinander.

  • Genau desshalb habe ich gefragt ^^
    Aber mir geht es darum, dass ich den Titel verschieben kann und so wie ihr meint, gäb es ja 2 unabhängig voneinander Titels.

    Hatt den wirklich keiner eine Idee?
    Gibt es dafür vlt ein bessers Ctrl (dass nicht im au3-Standard-Packet dabei ist :D ) ?

    Nur keine Hektik - das Leben ist stressig genug

    • Offizieller Beitrag
    Zitat

    Aber mir geht es darum, dass ich den Titel verschieben kann und so wie ihr meint, gäb es ja 2 unabhängig voneinander Titels.

    Was meinst du damit? Das anpassen der Spaltenbreite?

  • Wenn die Listview Ownerdrawn ist, dann ist prinzipiell bei der Markierung alles möglich :)... mir ist nur noch immer nicht ganz klar, was markiert werden soll ;( ... bemühe doch mal Paint.

    • Offizieller Beitrag

    Theretisch geh es schon, sowas zu erstellen. Dazu muß man aber das ListView regelrecht vergewaltigen.
    Hab aber heute keinen Nerv zu sowas. Vielleicht schreibt dir jemand ein Beispiel. Wenn nicht bastel ich die Tage daran,
    wenn ich mal wieder Langeweile habe.

    Zitat von KaFu

    Wenn die Listview Ownerdrawn ist, dann ist prinzipiell bei der Markierung alles möglich :).

    Genau das hatte ich eben im Hinterkopf. :D

    • Offizieller Beitrag

    Hatte gerade mal ein bischen Zeit und Lust um dir ein Beispiel zu schreiben. :D

    Spoiler anzeigen
    [autoit]

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

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

    Global $iSelectFirst = 0, $iSelectSecond = 0, $sSelectFirst, $sSelectSecond, $msg
    Global $aTest1[11] = ["Andy", "Berta", "Carlo", "Dora", "Erich", "Fred", "Georg", "Heinz", "Ingo", "Jan", "Klaus"]
    Global $aTest2[11] = ["Blub", "Test", "Blahblah", "Irgendwas", "Weißnicht", "Nochwas", "Egal", "Demo", "Ratata", "ETtc"]

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

    Global $hGUI = GUICreate("Spezial ListView", 300, 200)
    Global $ListView = GUICtrlCreateListView("Versteckt|Name|Unsinn", 2, 2, 296, 156, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_SIMPLESELECT))
    Global $hListView = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 0);1. Column ausblenden, da Ownerdraw im 1. Item nicht richtig funktioniert
    _GUICtrlListView_SetColumnWidth($hListView, 1, 150)
    _GUICtrlListView_SetColumnWidth($hListView, 2, 150)
    Global $hHeaderLV = _GUICtrlListView_GetHeader($hListView);Handle der Listviewheaders
    Global $Button = GUICtrlCreateButton("Ergebnis", 50, 170, 100, 21)

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

    For $i = 0 To 10
    _GUICtrlListView_AddItem($hListView, "Item " & $i); 11 Items erstellen
    Next
    ; 2. Array in 1. Column (Name) einfügen
    For $i = 0 To 10
    _GUICtrlListView_AddSubItem($hListView, $i - 1, $aTest1[$i], 1)
    Next
    ; 2. Array in 2. Column (Unsinn) einfügen
    For $i = 0 To 10
    _GUICtrlListView_AddSubItem($hListView, $i - 1, $aTest2[$i], 2)
    Next
    ;Auswahl beider Columns auf 0. Eintrag setzen
    $sSelectFirst = _GUICtrlListView_GetItemText($hListView, 0, 1)
    $sSelectSecond = _GUICtrlListView_GetItemText($hListView, 0, 2)

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

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

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button
    MsgBox(0, "Auswahl", "Auswahl 1 Spalte: " & $sSelectFirst & @CRLF & "Auswahl 2. Spalte: " & $sSelectSecond)
    EndSwitch
    WEnd

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $tNMHDR, $hWndFrom, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    ;============= Resizen der 1. Column verhindern ==========================
    Case $hHeaderLV
    Local $tNMHEADER = DllStructCreate($tagNMHEADER, $ilParam)
    Switch $iCode
    Case -320, -321 ; -320 = $HDN_ITEMCHANGINGW -321 = $HDN_ITEMCHANGEDW
    If DllStructGetData($tNMHEADER, "Item") = 0 Then Return 1
    EndSwitch
    ;============= Resizen der 1. Column verhindern ==========================
    Case $hListView
    Switch $iCode
    Case $NM_Click
    Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
    If $aHit[0] <> -1 And $aHit[1] = 0 Then
    Return 1
    ElseIf $aHit[0] <> -1 And $aHit[1] = 1 Then
    $oldSelect = $iSelectFirst
    $iSelectFirst = $aHit[0]
    $sSelectFirst = _GUICtrlListView_GetItemText($hListView, $aHit[0], $aHit[1])
    _GUICtrlListView_RedrawItems($hListView, $aHit[0], $aHit[0])
    _GUICtrlListView_RedrawItems($hListView, $oldSelect, $oldSelect)
    ElseIf $aHit[0] <> -1 And $aHit[1] = 2 Then
    $oldSelect = $iSelectSecond
    $iSelectSecond = $aHit[0]
    $sSelectSecond = _GUICtrlListView_GetItemText($hListView, $aHit[0], $aHit[1])
    _GUICtrlListView_RedrawItems($hListView, $aHit[0], $aHit[0])
    _GUICtrlListView_RedrawItems($hListView, $oldSelect, $oldSelect)
    EndIf
    Case $NM_CUSTOMDRAW
    Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
    $iDrawStage = DllStructGetData($tCustDraw, 'dwDrawStage')
    Local $iItem, $iColor1, $iColor2, $iColor3
    Switch DllStructGetData($tCustDraw, 'dwDrawStage')
    Case $CDDS_ITEMPREPAINT
    Return $CDRF_NOTIFYSUBITEMDRAW
    Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
    $iItem = DllStructGetData($tCustDraw, 'dwItemSpec')
    $iColor1 = RGB2BGR(0xFFFFFF) ; Standardhintergrundfarbe
    $iColor2 = RGB2BGR(0x000000)
    $iColor3 = RGB2BGR(0xFFFFFF)
    If DllStructGetData($tCustDraw, 'iSubItem') = 1 And $iSelectFirst = $iItem Then
    DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR(0x3300FF))
    DllStructSetData($tCustDraw, 'clrText', $iColor3)
    ElseIf DllStructGetData($tCustDraw, 'iSubItem') = 2 And $iSelectSecond = $iItem Then
    DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR(0x3399FF))
    DllStructSetData($tCustDraw, 'clrText', $iColor3)
    Else
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)
    DllStructSetData($tCustDraw, 'clrText', $iColor2)
    EndIf
    Return $CDRF_NEWFONT
    EndSwitch
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func RGB2BGR($iColor)
    Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
    EndFunc ;==>RGB2BGR

    [/autoit]

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.