Wait for the ColumnClick Event and get the FMT attribute from the LVM_GETCOLUMN ListView message and send the HDF_SORTDOWN or HDF_SORTUP attribute with the LVM_SETCOLUMN ListView message.
Code: Select all
MyGui := Gui()
LV := MyGui.Add("ListView", "w300 r8 Grid -LV0x10", ["Column1", "Column2", "Column3"])
loop 7
LV.Add(, A_Index * 1, A_Index * 2, A_Index * 3)
loop 3
LV.ModifyCol(A_Index, "80 Integer")
LV.OnEvent("ColClick", LV_SortArrow)
MyGui.Show()
LV_SortArrow(LV, Column)
{
static HDF_SORTUP := 0x0400
static HDF_SORTDOWN := 0x0200
static LVM_FIRST := 0x1000
static LVM_GETCOLUMNW := LVM_FIRST + 95
static LVM_SETCOLUMNW := LVM_FIRST + 96
static LVCF_FMT := 0x0001
Column -= 1
LVCOLUMNW := Buffer(56, 0)
NumPut("uint", LVCF_FMT, LVCOLUMNW, 0)
SendMessage(LVM_GETCOLUMNW, Column, LVCOLUMNW, LV.hWnd)
fmt := NumGet(LVCOLUMNW, 4, "int")
if (fmt & HDF_SORTUP)
NumPut("int", fmt & ~HDF_SORTUP | HDF_SORTDOWN, LVCOLUMNW, 4)
else if (fmt & HDF_SORTDOWN)
NumPut("int", fmt & ~HDF_SORTDOWN | HDF_SORTUP, LVCOLUMNW, 4)
else
{
loop LV.GetCount("Column")
{
if ((i := A_Index - 1) != Column)
{
SendMessage(LVM_GETCOLUMNW, i, LVCOLUMNW, LV.hWnd)
NumPut("int", NumGet(LVCOLUMNW, 4, "int") & ~(HDF_SORTDOWN | HDF_SORTUP), LVCOLUMNW, 4)
SendMessage(LVM_SETCOLUMNW, i, LVCOLUMNW, LV.hWnd)
}
}
NumPut("int", fmt | HDF_SORTUP, LVCOLUMNW, 4)
}
return SendMessage(LVM_SETCOLUMNW, Column, LVCOLUMNW, LV.hWnd)
}
Thanks to Solar and HotKeyIt for the v1.1 code (https://autohotkey.com/board/topic/64736-lv-sortarrow-apply-sort-arrows-to-your-listview/)