GUIs via DllCall: control zoo

Post your working scripts, libraries and tools for AHK v1.1 and older
Helgef
Posts: 4709
Joined: 17 Jul 2016, 01:02
Contact:

Re: GUIs via DllCall: control zoo

08 Jul 2017, 01:47

Doesn't ahkh have scrollabe guis?
arcticir
Posts: 694
Joined: 17 Nov 2013, 11:32

Re: GUIs via DllCall: control zoo

08 Jul 2017, 04:14

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)
} 
User avatar
jeeswg
Posts: 6902
Joined: 19 Dec 2016, 01:58
Location: UK

Re: GUIs via DllCall: control zoo

10 Oct 2017, 16:37

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.

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
}

;==================================================
LINKS:
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

Return to “Scripts and Functions (v1)”

Who is online

Users browsing this forum: kaka2 and 64 guests