But, I don't get a good result.
How do I get LVM_Insert, LVM_Modify, LVM_GetText, and LVM_GetColOrder to achieve accurate results?
Code: Select all
#singleinstance force
#Persistent
Gui := GuiCreate()
Lv := Gui.Add("ListView", "x5 y12 r10 w200 grid NoSortHdr", "a|b")
hLv := Lv.Hwnd
Gui.Show("xCenter yCenter w215 h250")
Gui.OnEvent("Close", "Gui_Close")
loop 5
Lv.Add(,A_Index,"a" A_Index)
LVM_Insert(hLV, 1,1,0,,"a","b")
LVM_Modify(hLV,1,1,0,,A_Sec,"modify!!")
LVM_Delete(hLV,3)
MsgBox(LVM_GetText(hLV,1,1))
MsgBox(LVM_GetColOrder(hLV))
return
EXIT:
Gui.Destroy()
ExitApp()
return
Gui_Close()
{
gosub("EXIT")
}
LVM_Insert(hLV, row:=0, col:=1, options:=0, f*) {
col := col!=0 ? col-1 : 0
row := row ? row-1 : DllCall("SendMessage", "uint", hLV, "uint", 4100, "uint", 0, "uint", 0)
VarSetCapacity(lvItem, A_PtrSize * 6, 0)
NumPut(9 , lvItem, A_PtrSize * 0 "uint") ; mask
NumPut(row , lvItem, A_PtrSize * 1, "int") ; iItem
NumPut(options, lvItem, A_PtrSize * 3, "uint") ; state
NumPut(1 , lvItem, A_PtrSize * 4, "uint") ; stateMask
DllCall("SendMessage", "uint", hLV, "uint", 4103, "uint", 0, "uint", &lvItem) ; LVM_INSERTITEM
For index,field in f
{
NumPut(col + A_Index - 1, lvItem, A_PtrSize * 2, "int") ; iSubItem
NumPut(&field , lvItem, A_PtrSize * 5, "ptr") ; pszText
DllCall("SendMessage", "uint", hLV, "uint", A_IsUnicode ? 4172 : 4171, "uint", 0, "ptr", &lvItem) ; LVM_SETITEMW
}
}
LVM_Modify(hLV, row, col:=1, o:=0, f*) {
col -= 1 ; convert to 0 based index
VarSetCapacity(lvItem, A_PtrSize * 6, 0)
NumPut(9, lvItem, "uint") ; mask
NumPut(row-1, lvItem, A_PtrSize, "int") ; iItem
NumPut(o, lvItem, A_PtrSize * 3, "uint") ; state
NumPut(1, lvItem, A_PtrSize * 4, "uint") ; stateMask
For index,field in f
{
NumPut(col + A_Index - 1, lvItem, A_PtrSize * 2, "int") ; iSubItem
NumPut(&field, lvItem, A_PtrSize * 5, "ptr") ; pszText
DllCall("SendMessage", "uint", hLV, "uint", A_IsUnicode ? 4172 : 4171, "uint", 0, "ptr", &lvItem) ; LVM_SETITEMW
}
}
LVM_GetColOrder(hLV) {
hdrH := DllCall("SendMessage", "uint", hLV, "uint", 4127) ; LVM_GETHEADER
hdrC := DllCall("SendMessage", "uint", hdrH, "uint", 4608) ; HDM_GETITEMCOUNT
VarSetCapacity(o, hdrC * A_PtrSize)
DllCall("SendMessage", "uint", hLV, "uint", 4155, "uint", hdrC, "ptr", &o) ; LVM_GETCOLUMNORDERARRAY
Loop hdrC
result .= NumGet(&o, (A_Index - 1) * A_PtrSize) + 1 . ","
result := SubStr(result, 1, -1*(1))
Return result
}
LVM_SetColOrder(hLV, col) {
col := StrSplit(col, ",")
VarSetCapacity(col, c0 * A_PtrSize)
Loop c0
NumPut(col%A_Index% - 1, col, (A_Index - 1) * A_PtrSize)
Return DllCall("SendMessage", "uint", hLV, "uint", 4154, "uint", c0, "ptr", &c) ; LVM_SETCOLUMNORDERARRAY
}
LVM_GetText(hLV, row, col:=1) {
row -= 1 ; convert to 0 based index
VarSetCapacity(t, 511, 1)
VarSetCapacity(lvItem, A_PtrSize * 7)
NumPut(1 , lvItem, A_PtrSize * 0 "uint") ; mask
NumPut(row , lvItem, A_PtrSize * 1, "int") ; iItem
NumPut(col-1, lvItem, A_PtrSize * 2, "int") ; iSubItem
NumPut(&t , lvItem, A_PtrSize * 5, "ptr") ; pszText
NumPut(512 , lvItem, A_PtrSize * 6) ; cchTextMax
DllCall("SendMessage", "uint", hLV, "uint", A_IsUnicode ? 4211 : 4141, "uint", row, "ptr", &lvItem) ;LVM_GETITEMTEXTW : LVM_GETITEMTEXTA
Return t
}
LVM_Delete(hLV, row:=0) {
row!=0 ? DllCall("SendMessage", "uint", hLV, "uint", 4104, "uint", row-1, "uint", 0) : DllCall("SendMessage", "uint", hLV, "uint", 4105, "uint", 0, "uint", 0) ; LVM_DELETEITEM : LVM_DELETEALLITEMS
}