https://autohotkey.com/board/topic/11926-can-you-move-a-listview-column-programmatically/
Code: Select all
LVM_FIRST := 0x1000
LVM_REDRAWITEMS := 21
LVM_SETCOLUMNORDERARRAY := 58
LVM_GETCOLUMNORDERARRAY := 59
Gui, Add, ListView, grid Checked vTestList, C1|C2|C3|C4|C5
Gui, Add, Button , gShift , Shift
Gui, Add, Button , gGet , Get
Gui, Add, Statusbar
Gui Show, Autosize Center +Resize, Column re-order test
LV_Add( "", "r1c1", "r1c2", "r1c3", "r1c4", "r1c5" )
LV_Add( "", "r2c1", "r2c2", "r2c3", "r2c4", "r2c5" )
LV_Add( "", "r3c1", "r3c2", "r3c3", "r3c4", "r3c5" )
LV_ModifyCol()
Return
Shift:
{
New_Column_Order := "3|5|1|2|4"
LV_Set_Column_Order( LV_GetCount( "Column" ), New_Column_Order )
}
return
Get:
{
MsgBox, % LV_Get_Column_Order( LV_GetCount( "Column" ) )
}
Return
LV_Set_Column_Order( _Num_Of_Columns, _New_Column_Order, _lvID="1", Delim="," )
{
local colOrder, pos
VarSetCapacity( colOrder, _Num_Of_Columns * 4, 0 )
Loop, Parse, _New_Column_Order, %Delim%
{
pos := A_Index - 1
NumPut( A_LoopField - 1, colOrder, pos * 4, "UInt" )
}
SendMessage, LVM_FIRST + LVM_SETCOLUMNORDERARRAY
, _Num_Of_Columns, &colOrder, SysListView32%_lvId%, A ; LVM_SETCOLUMNORDERARRAY
SendMessage, LVM_FIRST + LVM_REDRAWITEMS
, 0, _Num_Of_Columns - 1, SysListView32%_lvId%, A ; LVM_REDRAWITEMS
VarSetCapacity( colOrder, 0 ) ; Clean up.
}
LV_Get_Column_Order( _Num_Of_Columns, _lvID="1", Delim="," )
{
local colOrder, pos
Output := ""
VarSetCapacity( colOrder, _Num_Of_Columns * 4, 0 )
SendMessage, LVM_FIRST + LVM_GETCOLUMNORDERARRAY
, _Num_Of_Columns, &colOrder, SysListView32%_lvID%, A ; LVM_GETCOLUMNORDERARRAY
Loop, % _Num_Of_Columns
{
pos := A_Index - 1
Col := NumGet( colOrder, pos * 4, "UInt" ) + 1 ; Array is zero-based so we add one.
Output .= Col . Delim
}
StringTrimRight, Output, Output, 1 ; Trim trailing delimiter.
VarSetCapacity( colOrder, 0 ) ; Clean up.
Return, Output
}
GuiEscape:
GuiClose:
{
ExitApp
}
Return