GUIs via DllCall: control zoo
Re: GUIs via DllCall: control zoo
Doesn't ahkh have scrollabe guis?
Re: GUIs via DllCall: control zoo
This is a V1 example:
Code: Select all
gui,new
WS_CHILD := 0x40000000
WS_VSCROLL := 0X200000
WS_VISIBLE := 0x10000000
hwnd:=DllCall("CreateWindowEx", UInt,0, Str,"AutoHotkeyGui", Str,"", UInt,0, Int,200, Int,200, Int,400, Int,400, Ptr,0, Ptr,0, Ptr,0, Ptr,0, Ptr)
loop 20
DllCall("CreateWindowEx", UInt,0, Str,"static", Str,A_Index "______________________________", UInt,WS_CHILD | WS_VISIBLE, Int,25, Int,50*(A_Index-1), Int,400, Int,40, Ptr,hwnd, Ptr,0, Ptr,0, Ptr,0, Ptr)
vWinExStyle := 0
vWinClass := "ScrollBar"
vWinText := ""
;SBS_VERT := 0x1 ;SBS_RIGHTALIGN := 0x4
WS_CHILD := 0x40000000 ,WS_VISIBLE := 0x10000000
vWinStyle := WS_CHILD | WS_VISIBLE | 0x5
vPosX := 0, vPosY := 0, vPosW := 20, vPosH := 8000
hWndParent := hwnd
hMenu := 0, hInstance := 0, vParam := 0
hCtl := JEE_DCCreateWindowEx(0x200000, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)
DllCall("ShowWindow", UInt, hwnd, Int, 4)
Return
JEE_DCCreateWindowEx(vWinExStyle, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)
{
return DllCall("CreateWindowEx", UInt,vWinExStyle, Str,vWinClass, Str,vWinText, UInt,vWinStyle, Int,vPosX, Int,vPosY, Int,vPosW, Int,vPosH, Ptr,hWndParent, Ptr,hMenu, Ptr,hInstance, Ptr,vParam, Ptr)
}
Re: GUIs via DllCall: control zoo
I would be interested in scrollable GUIs. Has anybody got the scrollable GUI example above to work in Windows 7?
==================================================
GUIs via DllCall: listviews (and sorting rows/columns)
I wasn't particularly motivated or interested to do the code for this, but I thought it important that I should be able to implement it, as part of my GUIs via DllCall project. I would welcome any suggestions on improving the code, or answers to the 3 queries. Thanks.
LINKS:
Sort triangle in column header - Ask for Help - AutoHotkey Community
https://autohotkey.com/board/topic/1313 ... mn-header/
==================================================
GUIs via DllCall: listviews (and sorting rows/columns)
I wasn't particularly motivated or interested to do the code for this, but I thought it important that I should be able to implement it, as part of my GUIs via DllCall project. I would welcome any suggestions on improving the code, or answers to the 3 queries. Thanks.
Code: Select all
;==================================================
;listview controls - sort columns/rows (and put frames around cells)
;queries
;- how to refresh listview after columns rearranged? (LVM_REDRAWITEMS not working 100%, see bottom of listview)
;- how to remove icons (arrows) from listview headers?
;- how does AHK sort listview items (does it add in temporary lParam values for each listview item or not)?
;==================================================
vTextLVH = ;continuation section
(
LVH 1 LVH 2 LVH 3 LVH 4
)
vTextLVH = ;continuation section
(
LV A1 LV B1 LV C1
LV A2 LV B2 LV C2
LV A3 LV B3 LV C3
LV A4 LV B4 LV C4
LV A5 LV B5 LV C5
LV A6 LV B6 LV C6
)
vTextLVH = ;continuation section
(
HDR 1 HDR 2 HDR 3 HDR 4
)
vTextLV = ;continuation section
(
a q 5 5 a 1
b w 10 10 a 1
c e 15 a a 1
d r -5 -5 a 1
e t -10 -10 a 1
f y -15 b a 1
)
oArray := {}
vCountCol := 0
Loop, Parse, vTextLV, `n, `r
{
oArray.Push(StrSplit(A_LoopField, "`t"))
StrReplace(A_LoopField, "`t", "", vCount), vCount += 1
if (vCount > vCountCol)
vCountCol := vCount
}
vCountRow := oArray.Length()
oSortArrayType := ["t","t","n","n","t","n"]
oSortArrayState := [0,0,0,0,0,0]
;GUIs via DllCall: control zoo - AutoHotkey Community
;https://autohotkey.com/boards/viewtopic.php?f=6&t=32106
;create listview via DllCall
#SingleInstance force
#Persistent
JEE_ConstantsWinStyles()
JEE_RegisterClassExCFI("JEEClass", "MyWndProc", hIcon, hIconSm)
vWinClass := "JEEClass"
vWinText := "control zoo" ;window title
vWinStyle := WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX ;start with WS_VISIBLE off
vWinExStyle := WS_EX_DLGMODALFRAME | WS_EX_ACCEPTFILES
vPosX := 100, vPosY := 30
vPosW := 400, vPosH := 300
hWndParent := 0, hMenu := 0, hInstance := 0, vParam := 0
hGui := JEE_DCCreateWindowEx(vWinExStyle, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)
hWndParent := hGui, hMenu := 0, hInstance := 0, vParam := 0
vWinClass := "SysListView32"
vWinText := ""
;LVS_SHOWSELALWAYS := 0x8 ;LVS_REPORT := 0x1
vWinStyle |= WS_VISIBLE | WS_CHILD | WS_TABSTOP | 0x9
;WS_EX_CLIENTEDGE := 0x200 ;LVS_EX_HEADERDRAGDROP := 0x10
vWinExStyle := 0x210
vPosX := 30, vPosY := 30
vPosW := 300, vPosH := 200
hCtl := JEE_DCCreateWindowEx(vWinExStyle, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)
;==============================
;LISTVIEW - START
if (vWinClass = "SysListView32")
{
;insert columns
Loop, % vCountCol
{
vText := "LVH " A_Index
;LVCF_ORDER := 0x20 ;LVCF_TEXT := 0x4 ;LVCF_WIDTH := 0x2
VarSetCapacity(LVCOLUMN, A_PtrSize=8?56:44, 0)
NumPut(0x26, &LVCOLUMN, 0, "UInt") ;mask
if (A_Index = vCountCol)
NumPut(166, &LVCOLUMN, 8, "Int") ;cx
else
NumPut(50, &LVCOLUMN, 8, "Int") ;cx
NumPut(&vText, &LVCOLUMN, A_PtrSize=8?16:12, "Ptr") ;pszText
NumPut(StrLen(vText+1), &LVCOLUMN, A_PtrSize=8?24:16, "Int") ;cchTextMax
NumPut(A_Index-1, &LVCOLUMN, A_PtrSize=8?36:28, "Int") ;iOrder
SendMessage, 0x1061, % A_Index, % &LVCOLUMN, SysListView321, % "ahk_id " hGui ;LVM_INSERTCOLUMNW := 0x1061 ;LVM_INSERTCOLUMNA := 0x101B
}
;insert items (rows)
Loop, % vCountRow
SendMessage, % A_IsUnicode?0x104D:0x1007, 0, % &LVITEM, SysListView321, % "ahk_id " hGui ;LVM_INSERTITEMW := 0x104D ;LVM_INSERTITEMA := 0x1007
Loop, % vCountRow
{
vRow := A_Index
Loop, % vCountCol
{
vCol := A_Index ;, vColLet := Chr(64+vCol)
vText := oArray[vRow, vCol]
VarSetCapacity(LVITEM, A_PtrSize=8?88:60, 0)
vMask := (vCol = 1) ? 0x5 : 0x1
;it seems that trying to add lParam to something that isn't the main column means LVM_SETITEM fails
NumPut(vMask, &LVITEM, 0, "UInt") ;mask ;LVIF_TEXT := 0x1 ;LVIF_PARAM := 0x4
NumPut(vRow-1, &LVITEM, 4, "Int") ;iItem
NumPut(vCol-1, &LVITEM, 8, "Int") ;iSubItem
NumPut(&vText, &LVITEM, A_PtrSize=8?24:20, "Ptr") ;pszText
NumPut(vMaxChars, &LVITEM, A_PtrSize=8?32:24, "Int") ;cchTextMax
;these lParam values act as a row index
NumPut(1000+vRow, &LVITEM, A_PtrSize=8?40:32, "Ptr") ;lParam
SendMessage, % A_IsUnicode?0x104C:0x1006, 0, % &LVITEM, SysListView321, % "ahk_id " hGui ;LVM_SETITEMW := 0x104C ;LVM_SETITEMA := 0x1006
}
}
;select item
;LVIF_STATE := 0x8
;LVIS_SELECTED := 0x2 ;LVIS_FOCUSED := 0x1
VarSetCapacity(LVITEM, A_PtrSize=8?88:60, 0)
NumPut(0x8, &LVITEM, 0, "UInt") ;mask
NumPut(0, &LVITEM, 4, "Int") ;iItem
NumPut(0x3, &LVITEM, 12, "UInt") ;state
NumPut(0x3, &LVITEM, 16, "UInt") ;stateMask
SendMessage, % A_IsUnicode?0x104C:0x1006, 0, % &LVITEM, SysListView321, % "ahk_id " hGui ;LVM_SETITEMW := 0x104C ;LVM_SETITEMA := 0x1006
LVS_EX_GRIDLINES := 0x1
SendMessage, 0x1036, 0x1, 0x1, SysListView321, % "ahk_id " hGui ;LVM_SETEXTENDEDLISTVIEWSTYLE := 0x1036
;LVS_EX_FULLROWSELECT := 0x20
;SendMessage, 0x1036, 0x20, 0x20, SysListView321, % "ahk_id " hGui ;LVM_SETEXTENDEDLISTVIEWSTYLE := 0x1036
;LVS_EX_HEADERDRAGDROP := 0x10
SendMessage, 0x1036, 0x10, 0x10, SysListView321, % "ahk_id " hGui ;LVM_SETEXTENDEDLISTVIEWSTYLE := 0x1036
}
;LISTVIEW - END
;==============================
WinShow, % "ahk_id " hGui
WinActivate, % "ahk_id " hGui
return
;==================================================
;q:: ;listview - columns - get order (get column indexes)
ControlGet, hCtl, Hwnd,, SysListView321, A
SendMessage, 0x101F,,,, % "ahk_id " hCtl ;LVM_GETHEADER := 0x101F
hCtl2 := ErrorLevel
SendMessage, 0x1200,,,, % "ahk_id " hCtl2 ;HDM_GETITEMCOUNT := 0x1200
vCount := ErrorLevel
vArray := ""
VarSetCapacity(vArray, vCount*4)
SendMessage, 0x103B, % vCount, % &vArray,, % "ahk_id " hCtl ;LVM_GETCOLUMNORDERARRAY := 0x103B
vOutput := ""
Loop, % vCount
vOutput .= NumGet(vArray, A_Index*4-4, "Int")+1 ","
vOutput := SubStr(vOutput, 1, -1)
MsgBox, % vOutput
return
;==================================================
;w:: ;listview - columns - set order (sort columns)
ControlGet, hCtl, Hwnd,, SysListView321, A
vCount := JEE_LVGetColCount(hCtl)
vList := ""
Loop, % vCount
vList .= (A_Index=1?"":",") (vCount+1-A_Index)
vArray := ""
VarSetCapacity(vArray, vCount*4)
Loop, Parse, vList, % ","
NumPut(A_LoopField-1, vArray, A_Index*4-4, "Int")
SendMessage, 0x103A, % vCount, % &vArray,, % "ahk_id " hCtl ;LVM_SETCOLUMNORDERARRAY := 0x103A
SendMessage, 0x1015, 0, % vCount-1,, % "ahk_id " hCtl ;LVM_REDRAWITEMS := 0x1015
return
;==================================================
q:: ;listview - rows - get order (get row indexes) (lParam values)
;the lParam values were added when the listview was created
ControlGet, hCtl, Hwnd,, SysListView321, A
;MsgBox, % JEE_LVGetCount(hCtl)
vOutput := ""
Loop, % JEE_LVGetCount(hCtl)
{
vOutput .= A_Index " " JEE_LVItemGetLParam(hCtl, A_Index) "`r`n"
}
;Clipboard := vOutput
MsgBox, % vOutput
return
;==================================================
;listview - rows - set order (sort rows) (random)
;w::
;1234 is arbitrary (it becomes the 3rd parameter received by the Sort function)
ControlGet, hCtl, Hwnd,, SysListView321, A
pFunc := RegisterCallback("LVSortRandom", "F", 3)
SendMessage, 0x1030, 1234, % pFunc,, % "ahk_id " hCtl ;LVM_SORTITEMS := 0x1030
return
;==================================================
;listview - rows - set order (sort rows) (reverse)
;e::
ControlGet, hCtl, Hwnd,, SysListView321, A
oSortArrayPos := {}
Loop, % JEE_LVGetCount(hCtl)
{
lParam := JEE_LVItemGetLParam(hCtl, A_Index)
oSortArrayPos[lParam] := A_Index
}
pFunc := RegisterCallback("LVSortPosRev", "F", 3)
SendMessage, 0x1030, 0, % pFunc,, % "ahk_id " hCtl ;LVM_SORTITEMS := 0x1030
return
;==================================================
;listview - rows - set order (sort rows) (by text/number)
w::
e::
vCol := 6
vFunc := "LVSortText"
vFunc := "LVSortNum"
ControlGet, hCtl, Hwnd,, SysListView321, A
ControlGet, vText, List, % "Col" vCol,, % "ahk_id " hCtl
oSortArray := {}
oSortArrayPos := {}
oArray := StrSplit(vText, "`n")
Loop, % JEE_LVGetCount(hCtl)
{
lParam := JEE_LVItemGetLParam(hCtl, A_Index)
oSortArrayPos[lParam] := A_Index
oSortArray[lParam] := oArray[A_Index]
}
vSfx := InStr(A_ThisHotkey, "e") ? "Rev" : ""
pFunc := RegisterCallback(vFunc vSfx, "F", 3)
SendMessage, 0x1030, 0, % pFunc,, % "ahk_id " hCtl ;LVM_SORTITEMS := 0x1030
return
;==================================================
;e:: ;listview - put a frame around the listview/each cell
ControlGet, hCtl, Hwnd,, SysListView321, A
WinGetPos, vCtlX, vCtlY, vCtlW, vCtlH, % "ahk_id " hCtl
SendMessage, 0x101D, 0, 0,, % "ahk_id " hCtl ;LVM_GETCOLUMNWIDTH := 0x101D
vEltW1 := ErrorLevel
JEE_Borders(vCtlX+1, vCtlY+1, vCtlW-2, vCtlH-2, 1000, "FF0000", 1, 1)
Loop, % JEE_LVGetCount(hCtl)
{
vItem := A_Index-1
Loop, % JEE_LVGetColCount(hCtl)
{
VarSetCapacity(RECT, 16, 0)
;LVIR_BOUNDS := 0
NumPut(A_Index-1, &RECT, 4, "Int") ;top ;(subitem)
SendMessage, 0x1038, % vItem, % &RECT,, % "ahk_id " hCtl ;LVM_GETSUBITEMRECT := 0x1038
vEltX := NumGet(&RECT, 0, "Int"), vEltY := NumGet(&RECT, 4, "Int")
vEltW := NumGet(&RECT, 8, "Int")-vEltX, vEltH := NumGet(&RECT, 12, "Int") - vEltY
if (A_Index = 1)
vEltW := vEltW1
;MsgBox, % vEltX " " vEltY " " vEltW " " vEltH
JEE_Borders(vCtlX+vEltX+3, vCtlY+vEltY+2, vEltW-1, vEltH-1, 1000, "FF0000", 1, 1)
}
}
return
;==================================================
r::
ControlGet, hCtl, Hwnd,, SysHeader321, A
if !hIL
{
hIL := IL_Create(3)
IL_Add(hIL, "mmcndmgr.dll", 58) ;down arrow: descending order
IL_Add(hIL, "mmcndmgr.dll", 49) ;up arrow: ascending order
SendMessage, 0x1208, 0, % hIL,, % "ahk_id " hCtl ;HDM_SETIMAGELIST := 0x1208
}
vToggle := vToggle ? 0 : 1
;HDI_IMAGE := 0x20 ;HDI_BITMAP := 0x10
;HDI_FORMAT := 0x4 ;HDI_TEXT := 0x2
;HDF_STRING := 0x4000 ;HDF_BITMAP := 0x2000
;HDF_BITMAP_ON_RIGHT := 0x1000 ;HDF_IMAGE := 0x800
VarSetCapacity(HDITEM, A_PtrSize=8?72:48, 0)
NumPut(0x24, &HDITEM, 0, "UInt") ;mask
NumPut(0x5800, &HDITEM, A_PtrSize=8?28:20, "Int") ;fmt
NumPut(vToggle, &HDITEM, A_PtrSize=8?40:28, "Int") ;iImage
SendMessage, 0x120C, 0, % &HDITEM,, % "ahk_id " hCtl ;HDM_SETITEMW := 0x120C
;Sleep, 2000
;SendMessage, 0x1208, 0, 0,, % "ahk_id " hCtl ;HDM_SETIMAGELIST := 0x1208
;SendMessage, 0xB, 1, 0,, % "ahk_id " hCtl ;WM_SETREDRAW := 0xB
return
;==================================================
;t::
ControlGet, hCtl, Hwnd,, SysHeader321, A
VarSetCapacity(HDITEM, A_PtrSize=8?72:48, 0)
NumPut(0x24, &HDITEM, 0, "UInt") ;mask
NumPut(0x5800, &HDITEM, A_PtrSize=8?28:20, "Int") ;fmt
NumPut(2, &HDITEM, A_PtrSize=8?40:28, "Int") ;iImage
SendMessage, 0x120C, 0, % &HDITEM,, % "ahk_id " hCtl ;HDM_SETITEMW := 0x120C
return
;==================================================
MyWndProc(hWnd, uMsg, wParam, lParam)
{
static hIL
DetectHiddenWindows, On
global oSortArray, oSortArrayPos, oSortArrayType, oSortArrayState
;HDN_ITEMCLICKW := -322 ;HDN_ITEMCLICKA := -302
;HDN_ITEMDBLCLICKW := -323 ;HDN_ITEMDBLCLICKA := -303
;lParam points to an NMHEADER structure (which starts with an NMHDR structure)
if (uMsg = 0x4E) ;WM_NOTIFY := 0x4E
vCode := NumGet(lParam+0, A_PtrSize=8?16:8, "UInt") ;code
if (vCode = 0xFFFFFEBE) || (vCode = 0xFFFFFED2) ;-322 or -302
{
hCtl := NumGet(lParam+0, 0, "Ptr") ;hwndFrom
WinGetClass, vWinClass, % "ahk_id " hCtl
}
if (vWinClass = "SysHeader32")
{
if !hIL ;for setting arrows
{
hIL := IL_Create(3)
IL_Add(hIL, "mmcndmgr.dll", 58) ;down arrow: descending order
IL_Add(hIL, "mmcndmgr.dll", 49) ;up arrow: ascending order
SendMessage, 0x1208, 0, % hIL,, % "ahk_id " hCtl ;HDM_SETIMAGELIST := 0x1208
}
vCol := NumGet(lParam+0, A_PtrSize=8?24:12, "Ptr") + 1 ;iItem
vType := oSortArrayType[vCol]
vState := oSortArrayState[vCol]
if (vType = "t")
vFunc := "LVSortText"
else
vFunc := "LVSortNum"
if (vState = 0)
vState := 1, vFunc .= "Rev"
else
vState := 0
oSortArrayState[vCol] := vState
;header hCtl to listview hCtl
hCtl2 := DllCall("user32\GetAncestor", Ptr,hCtl, UInt,1, Ptr) ;GA_PARENT := 1
ControlGet, vText, List, % "Col" vCol,, % "ahk_id " hCtl2
oSortArray := {}
oSortArrayPos := {}
oArray := StrSplit(vText, "`n")
Loop, % JEE_LVGetCount(hCtl2)
{
lParam := JEE_LVItemGetLParam(hCtl2, A_Index)
oSortArrayPos[lParam] := A_Index
oSortArray[lParam] := oArray[A_Index]
;===============
;set arrow
;HDI_IMAGE := 0x20 ;HDI_BITMAP := 0x10
;HDI_FORMAT := 0x4 ;HDI_TEXT := 0x2
;HDF_STRING := 0x4000 ;HDF_BITMAP := 0x2000
;HDF_BITMAP_ON_RIGHT := 0x1000 ;HDF_IMAGE := 0x800
if !(A_Index = vCol)
vItem := 2
else
vItem := vState
VarSetCapacity(HDITEM, A_PtrSize=8?72:48, 0)
NumPut(0x24, &HDITEM, 0, "UInt") ;mask
NumPut(0x5800, &HDITEM, A_PtrSize=8?28:20, "Int") ;fmt
NumPut(vItem, &HDITEM, A_PtrSize=8?40:28, "Int") ;iImage
SendMessage, 0x120C, % A_Index-1, % &HDITEM,, % "ahk_id " hCtl ;HDM_SETITEMW := 0x120C
;===============
}
pFunc := RegisterCallback(vFunc, "F", 3)
SendMessage, 0x1030, 0, % pFunc,, % "ahk_id " hCtl2 ;LVM_SORTITEMS := 0x1030
}
return DllCall("user32\DefWindowProc", Ptr,hWnd, UInt,uMsg, UPtr,wParam, Ptr,lParam, Ptr)
}
;==================================================
;JEE_WinStylesInit
JEE_ConstantsWinStyles()
{
global
WS_OVERLAPPED := 0x0
WS_TABSTOP := 0x10000
WS_MAXIMIZEBOX := 0x10000
WS_MINIMIZEBOX := 0x20000
WS_GROUP := 0x20000
WS_THICKFRAME := 0x40000
WS_SYSMENU := 0x80000
WS_HSCROLL := 0x100000
WS_VSCROLL := 0x200000
WS_DLGFRAME := 0x400000
WS_BORDER := 0x800000
WS_CAPTION := 0xC00000
WS_OVERLAPPEDWINDOW := 0xCF0000
WS_MAXIMIZE := 0x1000000
WS_CLIPCHILDREN := 0x2000000
WS_CLIPSIBLINGS := 0x4000000
WS_DISABLED := 0x8000000
WS_VISIBLE := 0x10000000
WS_MINIMIZE := 0x20000000
WS_CHILD := 0x40000000
WS_POPUP := 0x80000000
WS_POPUPWINDOW := 0x80880000
WS_EX_LEFT := 0x0
WS_EX_LTRREADING := 0x0
WS_EX_RIGHTSCROLLBAR := 0x0
WS_EX_DLGMODALFRAME := 0x1
WS_EX_NOPARENTNOTIFY := 0x4
WS_EX_TOPMOST := 0x8
WS_EX_ACCEPTFILES := 0x10
WS_EX_TRANSPARENT := 0x20
WS_EX_MDICHILD := 0x40
WS_EX_TOOLWINDOW := 0x80
WS_EX_WINDOWEDGE := 0x100
WS_EX_CLIENTEDGE := 0x200
WS_EX_CONTEXTHELP := 0x400
WS_EX_RIGHT := 0x1000
WS_EX_RTLREADING := 0x2000
WS_EX_LEFTSCROLLBAR := 0x4000
WS_EX_CONTROLPARENT := 0x10000
WS_EX_STATICEDGE := 0x20000
WS_EX_APPWINDOW := 0x40000
WS_EX_OVERLAPPEDWINDOW := 0x300
WS_EX_PALETTEWINDOW := 0x188
}
;==================================================
JEE_DCCreateWindowEx(vWinExStyle, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)
{
return DllCall("user32\CreateWindowEx", UInt,vWinExStyle, Str,vWinClass, Str,vWinText, UInt,vWinStyle, Int,vPosX, Int,vPosY, Int,vPosW, Int,vPosH, Ptr,hWndParent, Ptr,hMenu, Ptr,hInstance, Ptr,vParam, Ptr)
}
;==================================================
JEE_RegisterClassExCFI(vWinClass, vFunc, hIcon=0, hIconSm="")
{
pWndProc := RegisterCallback(vFunc, "F")
hCursor := DllCall("user32\LoadCursor", Ptr,0, Ptr,32512, Ptr) ;IDC_ARROW := 32512
if (hIconSm = "")
hIconSm := hIcon
vPIs64 := (A_PtrSize=8)
vSize := vPIs64?80:48
VarSetCapacity(WNDCLASSEX, vSize, 0)
NumPut(vSize, &WNDCLASSEX, 0, "UInt") ;cbSize
NumPut(3, &WNDCLASSEX, 4, "UInt") ;style
NumPut(pWndProc, &WNDCLASSEX, 8, "Ptr") ;lpfnWndProc
NumPut(0, &WNDCLASSEX, vPIs64?16:12, "Int") ;cbClsExtra
NumPut(0, &WNDCLASSEX, vPIs64?20:16, "Int") ;cbWndExtra
NumPut(0, &WNDCLASSEX, vPIs64?24:20, "Ptr") ;hInstance
NumPut(hIcon, &WNDCLASSEX, vPIs64?32:24, "Ptr") ;hIcon
NumPut(hCursor, &WNDCLASSEX, vPIs64?40:28, "Ptr") ;hCursor
NumPut(16, &WNDCLASSEX, vPIs64?48:32, "Ptr") ;hbrBackground
NumPut(0, &WNDCLASSEX, vPIs64?56:36, "Ptr") ;lpszMenuName
NumPut(&vWinClass, &WNDCLASSEX, vPIs64?64:40, "Ptr") ;lpszClassName
NumPut(hIconSm, &WNDCLASSEX, vPIs64?72:44, "Ptr") ;hIconSm
return DllCall("user32\RegisterClassEx", Ptr,&WNDCLASSEX, UShort)
}
;==================================================
JEE_Borders(vPosX, vPosY, vPosW:=0, vPosH:=0, vTime:=1000, vCol:="FFFF00", vBdrW:=5, vBdrH:=5)
{
CoordMode, Pixel, Screen
SplashImage, 1:, % "B W" vPosW+(2*vBdrW) "H" vBdrH "X" vPosX-vBdrW "Y" vPosY-vBdrH "Cw" vCol,,, SP1 ;top
SplashImage, 2:, % "B W" vPosW+(2*vBdrW) "H" vBdrH "X" vPosX-vBdrW "Y" vPosY+vPosH "Cw" vCol,,, SP2 ;bottom
SplashImage, 3:, % "B W" vBdrW "H" vPosH+(2*vBdrH) "X" vPosX-vBdrW "Y" vPosY-vBdrH "Cw" vCol,,, SP3 ;left
SplashImage, 4:, % "B W" vBdrW "H" vPosH+(2*vBdrH) "X" vPosX+vPosW "Y" vPosY-vBdrH "Cw" vCol,,, SP4 ;right
Sleep, % vTime
SplashImage, 1: Off
SplashImage, 2: Off
SplashImage, 3: Off
SplashImage, 4: Off
}
;==================================================
;JEE_LVGetRowCount
;JEE_LVGetIconCount
;JEE_LVGetItemCount
JEE_LVGetCount(hCtl)
{
SendMessage, 0x1004, 0, 0,, % "ahk_id " hCtl ;LVM_GETITEMCOUNT := 0x1004
return ErrorLevel
}
;==================================================
JEE_LVGetColCount(hCtl)
{
SendMessage, 0x101F,,,, % "ahk_id " hCtl ;LVM_GETHEADER := 0x101F
hLVH := ErrorLevel
SendMessage, 0x1200,,,, % "ahk_id " hLVH ;HDM_GETITEMCOUNT := 0x1200
return ErrorLevel
}
;==================================================
JEE_LVItemGetLParam(hCtl, vItem)
{
VarSetCapacity(LVITEM, A_PtrSize=8?88:60, 0)
NumPut(0x4, &LVITEM, 0, "UInt") ;mask ;LVIF_PARAM := 0x4
NumPut(vItem-1, &LVITEM, 4, "Int") ;iItem
SendMessage, % A_IsUnicode?0x104B:0x1005, 0, % &LVITEM,, % "ahk_id " hCtl ;LVM_GETITEMW := 0x104B
lParam := NumGet(&LVITEM, A_PtrSize=8?40:32, "Ptr") ;lParam
return lParam
}
;==================================================
;if return 1 then lParam1 goes later, lParam2 goes earlier
;if return -1 then lParam1 goes earlier, lParam2 goes later
LVSortPosRev(lParam1, lParam2, lParamSort)
{
global oSortArrayPos
vPos1 := oSortArrayPos[lParam1]
vPos2 := oSortArrayPos[lParam2]
return vPos2 - vPos1
}
;==================================================
LVSortNum(lParam1, lParam2, lParamSort)
{
global oSortArray
global oSortArrayPos
vNum1 := oSortArray[lParam1] + 0
vNum2 := oSortArray[lParam2] + 0
vPos1 := oSortArrayPos[lParam1]
vPos2 := oSortArrayPos[lParam2]
return vNum1 > vNum2 ? 1 : vNum1 < vNum2 ? -1 : (vPos1-vPos2)
}
;==================================================
LVSortNumRev(lParam1, lParam2, lParamSort)
{
global oSortArray
global oSortArrayPos
vNum1 := oSortArray[lParam1] + 0
vNum2 := oSortArray[lParam2] + 0
vPos1 := oSortArrayPos[lParam1]
vPos2 := oSortArrayPos[lParam2]
return vNum1 > vNum2 ? -1 : vNum1 < vNum2 ? 1 : (vPos1-vPos2)
}
;==================================================
LVSortText(lParam1, lParam2, lParamSort)
{
global oSortArray
global oSortArrayPos
vText1 := oSortArray[lParam1]
vText2 := oSortArray[lParam2]
vPos1 := oSortArrayPos[lParam1]
vPos2 := oSortArrayPos[lParam2]
return ("" vText1) > vText2 ? 1 : ("" vText1) < vText2 ? -1 : (lParam1-lParam2)
}
;==================================================
LVSortTextRev(lParam1, lParam2, lParamSort)
{
global oSortArray
global oSortArrayPos
vText1 := oSortArray[lParam1]
vText2 := oSortArray[lParam2]
vPos1 := oSortArrayPos[lParam1]
vPos2 := oSortArrayPos[lParam2]
return ("" vText1) > vText2 ? -1 : ("" vText1) < vText2 ? 1 : (lParam1-lParam2)
}
;==================================================
LVSortRandom(lParam1, lParam2, lParamSort)
{
Random, vRand, -1, 1
return vRand
}
;==================================================
Sort triangle in column header - Ask for Help - AutoHotkey Community
https://autohotkey.com/board/topic/1313 ... mn-header/
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
Return to “Scripts and Functions (v1)”
Who is online
Users browsing this forum: No registered users and 80 guests