Ich habe mir das mit dem sortieren beim Listview mal in C++ angesehen.
Man braucht gar nicht das Colum-Image ändern. Stattdessen handelt es sich um den Header des Listviews.
Das Handle zum Header kann man ermitteln und dann die Sortierpfeile entsprechend anpassen (HDF_SORTUP und HDF_SORTDOWN).
Hier mal als Beispielcode:
Code
import wNim, random, winim
randomize()
let app = App()
let frame = Frame(title="ListviewSort", size=(640, 520))
let panel = Panel(frame)
let button = Button(panel, label="Sort", pos=(20, 420))
let idPlaylist = ListCtrl(panel, style=wLcReport or wBorderSimple, pos=(10, 10), size=(600, 400))
idPlaylist.font = Font(14, faceName="Arial", weight=wFontWeightNormal)
idPlaylist.setBackgroundColor(0x00DDDDDD)
idPlaylist.appendColumn("Interpret", width=200, format=wListFormatLeft)
idPlaylist.appendColumn("Titel", width=200, format=wListFormatLeft)
idPlaylist.appendColumn("Laufzeit", width=110, format=wListFormatRight)
proc getItemTextString(self: wListCtrl, idx: int): seq[string] =
let iCol = self.getColumnCount() # Anzahl der Spalten ermitteln
for i in 0..iCol - 1: # Itemtext auslesen (alle Spalten)
result.add(self.getItemText(idx, i))
proc setItemTextString(self: wListCtrl, idx: int, sText: seq[string]): bool {.discardable.} =
let iCol = self.getColumnCount() # Anzahl der Spalten ermitteln
if iCol != sText.len: return false
for i in 0..iCol - 1: # Itemtext ersetzen (alle Spalten)
self.setItemText(idx, i, sText[i])
# Ein paar Beispieldaten in das Listview eintragen
idPlaylist.appendItem(["ZZ Down", "Gimme All", "03:53"])
idPlaylist.appendItem(["Johnson Twins", "Bla bla", "04:16"])
idPlaylist.appendItem(["Kniff Richard", "Yeah", "05:11"])
idPlaylist.appendItem(["Roller Stones", "Gimme Shelter", "04:03"])
idPlaylist.appendItem(["Ralph a Ville", "Moin", "03:46"])
var
iSortCol, iOldCol: int = -1
bSortDir: bool = false
bRanSort: bool = false
# Callback-Funktion zum sortieren der Eintraege
proc sortCmp(item1: int; item2: int; data: int): int =
if bRanSort: return sample([-1, 1])
result = cmp(idPlaylist.getItemText(item1, iSortCol), idPlaylist.getItemText(item2, iSortCol))
if bSortDir: result *= -1
# Funktion zum setzen des Sortierpfeils
proc setSortArrow(self: wListCtrl, idx: int, arrow: int): bool {.discardable.} =
var hdrItem: HDITEMA
let header = HWND SendMessage(self.mHwnd, LVM_GETHEADER, 0, 0)
if header != 0:
hdrItem.mask = HDI_FORMAT
if SendMessage(header, HDM_GETITEMA, idx, cast[LPARAM](&hdrItem)) != 0:
case arrow:
of 0:
hdrItem.fmt = (hdrItem.fmt and not(HDF_SORTUP or HDF_SORTDOWN))
of 1:
hdrItem.fmt = (hdrItem.fmt and not(HDF_SORTUP)) or HDF_SORTDOWN
of 2:
hdrItem.fmt = (hdrItem.fmt and not(HDF_SORTDOWN)) or HDF_SORTUP
else:
return false
SendMessage(header, HDM_SETITEMA, idx, cast[LPARAM](&hdrItem))
return true
return false
# Beim Klick auf ein Spalten-Header
idPlaylist.wEvent_ListColClick do (event: wEvent):
iSortCol = event.getColumn() # die Spalte ermitteln
if iSortCol == iOldCol: # wenn die gleiche Spalte wie vorher
bSortDir = not bSortDir # dann Sortier-Richtung umdrehen
else: # ansonsten
bSortDir = false # Sortier-Richtung auf aufsteigend setzen
idPlaylist.setSortArrow(iOldCol, 0) # Pfeil von der alten Spalte entfernen
iOldCol = iSortCol # die Spalte merken
idPlaylist.setSortArrow(iSortCol, if bSortDir: 2 else: 1) # je nach Sortier-Richtung den Pfeil setzen
idPlaylist.sortItemsByIndex(sortCmp) # und das Listview sortieren (Callback fuer den Vergleich)
button.wEvent_Button do ():
bRanSort = true
idPlaylist.sortItemsByIndex(sortCmp) # und das Listview sortieren (Callback fuer den Vergleich)
bRanSort = false
frame.center()
frame.show()
app.mainLoop()
Alles anzeigen
Screenshot: