Older Version
Newer Version
eaglesoar
Oct 9, 2006
'This demo requires msghook.dll by Dennis McKinney
'Get it here: http://www.syberden.net/libertybelle/dlls.htm
'Alyce Watson provided the listview code.
' http://www.alycesrestaurant.com
'listview control with double click 10/09/2006 Eldron Gill
nomainwin
dim info$(0,0)
If fileExists(DefaultDir$, "msghook.dll") < 1 then
notice ""+chr$(13)+"This demo requires msghook.dll by Dennis McKinney"+chr$(13)+_
"Download the dll from here : http://www.syberden.net/libertybelle/dlls.htm "+chr$(13)+_
"Place it in the folder with this code."
End
End If
'constants
LVS.NOSORTHEADER = 32768
LVS.REPORT = 1
LVS.SINGLESEL = 4
LVS.SHOWSELALWAYS = 8
LVS.SORTASCENDING = 16
LVS.SORTDESCENDING = 32
LVS.NOLABELWRAP = 128
LVS.AUTOARRANGE = 256
LVS.NOSCROLL = 8192
LVS.ALIGNTOP = 0
LVS.ALIGNLEFT = 2048
LVS.NOCOLUMNHEADER = 16384
LVIF.TEXT = 1
LVIF.STATE = 8
LVIS.UNSELECTED = 0
LVIS.FOCUSED = 1
LVIS.SELECTED = 2
LVM.FIRST = 4096
LVM.SETITEM = 4102
LVM.INSERTITEM = 4103
LVM.INSERTCOLUMN = 4123
LVM.GETITEMCOUNT = 4100
LVM.GETITEMA = 4101
LVM.GETITEMTEXTA = 4141
LVM.GETITEMSTATE = 4138
LVM.SETITEMSTATE = 4139
LVM.DELETEITEM = 4104
LVM.DELETEALLITEMS = 4105
LVCF.WIDTH = 2
LVCF.TEXT = 4
'create structs
Struct LVCOLUMN, _
mask As ulong, _
fmt As long, _
cx As long, _
pszText$ As ptr, _
cchTextMax As long, _
iSubItem As long, _
iImage As long, _
iOrder As long
Struct LVITEM, _
mask As ulong, _
iItem As long, _
iSubItem As long, _
state As ulong, _
stateMask As ulong, _
pszText$ As ptr, _
cchTextMax As long, _
iImage As long, _
lParam As long, _
iIndent As long
struct msg,_
hndl as long,_
message as long,_
wParam as long,_
lParam as long,_
LOWORDwparam as word,_
HIWORDwparam as word,_
LOWORDlparam as word,_
HIWORDlparam as word
'initialize common controls:
calldll #comctl32, "InitCommonControls",re as void
' Open a window
WindowWidth = 240: WindowHeight = 200
UpperLeftX = 10: UpperLeftY = 10
button #1.b, "Add",[add],UL,10,10,90,24
button #1.d, "Delete",[delete],UL,120,10,90,24
button #1.GetMsgHookCallback, "", [choice], ul, 0, 0, 0, 0
statictext #1.s, "List count: 2",10,140,100,30
open "Listview Example" for dialog as #1
print #1, "trapclose [quit]"
hwndParent = hwnd(#1)
' Get window instance handle
CallDLL #user32, "GetWindowLongA",_
hwndParent As long,_ 'parent window handle
_GWL_HINSTANCE As long,_'flag to retrieve instance handle
hInstance As long 'instance handle
' Create control
style = _WS_CHILD OR _WS_VISIBLE OR LVS.NOSORTHEADER _
OR LVS.REPORT OR LVS.SINGLESEL OR LVS.SHOWSELALWAYS
calldll #user32, "CreateWindowExA",_
_WS_EX_CLIENTEDGE As long,_ ' extended style
"SysListView32" as ptr,_ ' class name
"" as ptr,_
style as long,_ ' style
10 as long,_ ' left x
50 as long,_ ' top y
200 as long,_ ' width
80 as long,_ ' height
hwndParent as long,_ ' parent hWnd
0 as long,_
hInstance as long,_ ' hInstance
"" as ptr,_
hwndLV as long ' listview handle
'insert first column:
LVCOLUMN.mask.struct = LVCF.WIDTH OR LVCF.TEXT
LVCOLUMN.cx.struct = 90
LVCOLUMN.pszText$.struct = "Name"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTCOLUMN As long, _
0 As long, _ '0 = first column
LVCOLUMN As struct, _
r As long
'insert second column:
LVCOLUMN.cx.struct = 65
LVCOLUMN.pszText$.struct = "Rank"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTCOLUMN As long, _
1 As long, _ '1 = second column
LVCOLUMN As struct, _
r As long
'insert text for first row, first column
'requires message to insert item
LVITEM.mask.struct = LVIF.TEXT
LVITEM.iItem.struct = 0 'first row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.pszText$.struct = "Carl Gundel"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTITEM As long, _
0 As long, _
LVITEM As struct, _
r As long
'insert text for second column, first row
LVITEM.iItem.struct = 0 'first row
LVITEM.iSubItem.struct = 1 'second column
LVITEM.pszText$.struct = "Expert"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETITEM As long, _ '
0 As long, _
LVITEM As struct, _
r As long
'insert second row, first column
LVITEM.iItem.struct = 1 'second row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.pszText$.struct = "Bill Gates"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTITEM As long, _
0 As long, _
LVITEM As struct, _
r As long
'add second column to second row
LVITEM.iItem.struct = 1 'second row
LVITEM.iSubItem.struct = 1 'second column
LVITEM.pszText$.struct = "Novice"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETITEM As long, _ '
0 As long, _
LVITEM As struct, _
r As long
'full row select
LVM.FIRST = hexdec("1000")
LVM.SETEXTENDEDLISTVIEWSTYLE = LVM.FIRST + 54
LVS.EX.FULLROWSELECT = hexdec("20")
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETEXTENDEDLISTVIEWSTYLE As long, _ '
LVS.EX.FULLROWSELECT As long, _
LVS.EX.FULLROWSELECT As long, _
r As long
' if you want a grid, leave next message uncommented...
CallDll #user32, "SendMessageA" , hwndLV as uLong, 4150 as Long,_
1 As Long, 1 As Long, re as Long '
open "MsgHook" for dll as #MsgHook
hMsgProc = hwnd(#1.GetMsgHookCallback)
calldll #MsgHook, "TrapMsgFor",hwndLV as long, ret as boolean
calldll #MsgHook, "WatchMsg", hwndLV as long, _WM_LBUTTONDBLCLK as long, ret as boolean
hMsgProc = hwnd(#1.GetMsgHookCallback)
calldll #user32, "GetWindowLongA",hMsgProc as long,_GWL_ID as short,callbackID as long
calldll #MsgHook, "CreateGetMsgProcHook", hwndParent as long, callbackID as long, _
hMsgProc as long, hHook as long
wait
[choice] 'determine user selection
calldll #MsgHook, "GetMsg", msg as struct, ret as void
'get number of items in list:
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMCOUNT As long, _
0 As long, _ 'always 0
0 As long, _ 'always 0
total As long
for index = 0 to total-1 'check each row
LVITEM.mask.struct = LVIF.TEXT OR LVIF.STATE
LVITEM.iItem.struct = index 'row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.cchTextMax.struct = 32
LVITEM.pszText$.struct = space$(32)
LVITEM.stateMask.struct = LVIS.SELECTED
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMA As long, _
index As long, _ 'index of row
LVITEM As struct, _
r As long
state = LVITEM.state.struct 'selected state of item
if state and LVIS.SELECTED then
txt$=winstring(LVITEM.pszText$.struct)
notice "Selected: ";txt$
exit for
end if
next
if txt$="" then notice "No selection."
txt$=""
wait
[add]
'make sure no item is in selected state:
LVITEM.stateMask.struct = LVIS.SELECTED 'bit to set
LVITEM.state.struct = LVIS.UNSELECTED
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETITEMSTATE As long, _
-1 As long, _ 'change applies to all items
LVITEM As struct, _
r As long
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMCOUNT As long, _
0 As long, _ 'always 0
0 As long, _ 'always 0
count As long
name$="No Name"
prompt "Name?";name$
if name$="" then name$="No Name"
'insert next row, first column
LVITEM.mask.struct = LVIF.TEXT
LVITEM.iItem.struct = count 'next row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.pszText$.struct = name$
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTITEM As long, _
0 As long, _
LVITEM As struct, _
r As long
level$="No Level"
prompt "Level?";level$
if level$="" then level$="No Level"
'add second column to row
LVITEM.iItem.struct = count 'next row
LVITEM.iSubItem.struct = 1 'second column
LVITEM.pszText$.struct = level$
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETITEM As long, _
0 As long, _
LVITEM As struct, _
r As long
print #1.s, "List count: ";count+1
wait
[delete]'get user selection and delete
'get number of items in list:
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMCOUNT As long, _
0 As long, _ 'always 0
0 As long, _ 'always 0
total As long
for index = 0 to total-1 'check each row
LVITEM.mask.struct = LVIF.STATE
LVITEM.iItem.struct = index 'row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.stateMask.struct = LVIS.SELECTED
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMA As long, _
index As long, _ 'index of row
LVITEM As struct, _
r As long
state = LVITEM.state.struct 'selected state of item
if state and LVIS.SELECTED then
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.DELETEITEM As long, _
index As long, _
LVITEM As struct, _
r As long
exit for
end if
next
print #1.s, "List count: ";total-1
wait
[quit]
calldll #MsgHook, "UnhookMsgHook", hHook as long, ret as void
close #MsgHook
calldll #user32, "DestroyWindow", _
hwndLV as long, re as long
' Close handles.
close #1:end
'Function to determine if a file exists
function fileExists(path$, filename$)
files path$, filename$, info$()
fileExists = val(info$(0, 0)) 'non zero is true
end function
'Get it here: http://www.syberden.net/libertybelle/dlls.htm
'Alyce Watson provided the listview code.
' http://www.alycesrestaurant.com
'listview control with double click 10/09/2006 Eldron Gill
nomainwin
dim info$(0,0)
If fileExists(DefaultDir$, "msghook.dll") < 1 then
notice ""+chr$(13)+"This demo requires msghook.dll by Dennis McKinney"+chr$(13)+_
"Download the dll from here : http://www.syberden.net/libertybelle/dlls.htm "+chr$(13)+_
"Place it in the folder with this code."
End
End If
'constants
LVS.NOSORTHEADER = 32768
LVS.REPORT = 1
LVS.SINGLESEL = 4
LVS.SHOWSELALWAYS = 8
LVS.SORTASCENDING = 16
LVS.SORTDESCENDING = 32
LVS.NOLABELWRAP = 128
LVS.AUTOARRANGE = 256
LVS.NOSCROLL = 8192
LVS.ALIGNTOP = 0
LVS.ALIGNLEFT = 2048
LVS.NOCOLUMNHEADER = 16384
LVIF.TEXT = 1
LVIF.STATE = 8
LVIS.UNSELECTED = 0
LVIS.FOCUSED = 1
LVIS.SELECTED = 2
LVM.FIRST = 4096
LVM.SETITEM = 4102
LVM.INSERTITEM = 4103
LVM.INSERTCOLUMN = 4123
LVM.GETITEMCOUNT = 4100
LVM.GETITEMA = 4101
LVM.GETITEMTEXTA = 4141
LVM.GETITEMSTATE = 4138
LVM.SETITEMSTATE = 4139
LVM.DELETEITEM = 4104
LVM.DELETEALLITEMS = 4105
LVCF.WIDTH = 2
LVCF.TEXT = 4
'create structs
Struct LVCOLUMN, _
mask As ulong, _
fmt As long, _
cx As long, _
pszText$ As ptr, _
cchTextMax As long, _
iSubItem As long, _
iImage As long, _
iOrder As long
Struct LVITEM, _
mask As ulong, _
iItem As long, _
iSubItem As long, _
state As ulong, _
stateMask As ulong, _
pszText$ As ptr, _
cchTextMax As long, _
iImage As long, _
lParam As long, _
iIndent As long
struct msg,_
hndl as long,_
message as long,_
wParam as long,_
lParam as long,_
LOWORDwparam as word,_
HIWORDwparam as word,_
LOWORDlparam as word,_
HIWORDlparam as word
'initialize common controls:
calldll #comctl32, "InitCommonControls",re as void
' Open a window
WindowWidth = 240: WindowHeight = 200
UpperLeftX = 10: UpperLeftY = 10
button #1.b, "Add",[add],UL,10,10,90,24
button #1.d, "Delete",[delete],UL,120,10,90,24
button #1.GetMsgHookCallback, "", [choice], ul, 0, 0, 0, 0
statictext #1.s, "List count: 2",10,140,100,30
open "Listview Example" for dialog as #1
print #1, "trapclose [quit]"
hwndParent = hwnd(#1)
' Get window instance handle
CallDLL #user32, "GetWindowLongA",_
hwndParent As long,_ 'parent window handle
_GWL_HINSTANCE As long,_'flag to retrieve instance handle
hInstance As long 'instance handle
' Create control
style = _WS_CHILD OR _WS_VISIBLE OR LVS.NOSORTHEADER _
OR LVS.REPORT OR LVS.SINGLESEL OR LVS.SHOWSELALWAYS
calldll #user32, "CreateWindowExA",_
_WS_EX_CLIENTEDGE As long,_ ' extended style
"SysListView32" as ptr,_ ' class name
"" as ptr,_
style as long,_ ' style
10 as long,_ ' left x
50 as long,_ ' top y
200 as long,_ ' width
80 as long,_ ' height
hwndParent as long,_ ' parent hWnd
0 as long,_
hInstance as long,_ ' hInstance
"" as ptr,_
hwndLV as long ' listview handle
'insert first column:
LVCOLUMN.mask.struct = LVCF.WIDTH OR LVCF.TEXT
LVCOLUMN.cx.struct = 90
LVCOLUMN.pszText$.struct = "Name"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTCOLUMN As long, _
0 As long, _ '0 = first column
LVCOLUMN As struct, _
r As long
'insert second column:
LVCOLUMN.cx.struct = 65
LVCOLUMN.pszText$.struct = "Rank"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTCOLUMN As long, _
1 As long, _ '1 = second column
LVCOLUMN As struct, _
r As long
'insert text for first row, first column
'requires message to insert item
LVITEM.mask.struct = LVIF.TEXT
LVITEM.iItem.struct = 0 'first row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.pszText$.struct = "Carl Gundel"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTITEM As long, _
0 As long, _
LVITEM As struct, _
r As long
'insert text for second column, first row
LVITEM.iItem.struct = 0 'first row
LVITEM.iSubItem.struct = 1 'second column
LVITEM.pszText$.struct = "Expert"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETITEM As long, _ '
0 As long, _
LVITEM As struct, _
r As long
'insert second row, first column
LVITEM.iItem.struct = 1 'second row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.pszText$.struct = "Bill Gates"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTITEM As long, _
0 As long, _
LVITEM As struct, _
r As long
'add second column to second row
LVITEM.iItem.struct = 1 'second row
LVITEM.iSubItem.struct = 1 'second column
LVITEM.pszText$.struct = "Novice"
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETITEM As long, _ '
0 As long, _
LVITEM As struct, _
r As long
'full row select
LVM.FIRST = hexdec("1000")
LVM.SETEXTENDEDLISTVIEWSTYLE = LVM.FIRST + 54
LVS.EX.FULLROWSELECT = hexdec("20")
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETEXTENDEDLISTVIEWSTYLE As long, _ '
LVS.EX.FULLROWSELECT As long, _
LVS.EX.FULLROWSELECT As long, _
r As long
' if you want a grid, leave next message uncommented...
CallDll #user32, "SendMessageA" , hwndLV as uLong, 4150 as Long,_
1 As Long, 1 As Long, re as Long '
open "MsgHook" for dll as #MsgHook
hMsgProc = hwnd(#1.GetMsgHookCallback)
calldll #MsgHook, "TrapMsgFor",hwndLV as long, ret as boolean
calldll #MsgHook, "WatchMsg", hwndLV as long, _WM_LBUTTONDBLCLK as long, ret as boolean
hMsgProc = hwnd(#1.GetMsgHookCallback)
calldll #user32, "GetWindowLongA",hMsgProc as long,_GWL_ID as short,callbackID as long
calldll #MsgHook, "CreateGetMsgProcHook", hwndParent as long, callbackID as long, _
hMsgProc as long, hHook as long
wait
[choice] 'determine user selection
calldll #MsgHook, "GetMsg", msg as struct, ret as void
'get number of items in list:
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMCOUNT As long, _
0 As long, _ 'always 0
0 As long, _ 'always 0
total As long
for index = 0 to total-1 'check each row
LVITEM.mask.struct = LVIF.TEXT OR LVIF.STATE
LVITEM.iItem.struct = index 'row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.cchTextMax.struct = 32
LVITEM.pszText$.struct = space$(32)
LVITEM.stateMask.struct = LVIS.SELECTED
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMA As long, _
index As long, _ 'index of row
LVITEM As struct, _
r As long
state = LVITEM.state.struct 'selected state of item
if state and LVIS.SELECTED then
txt$=winstring(LVITEM.pszText$.struct)
notice "Selected: ";txt$
exit for
end if
next
if txt$="" then notice "No selection."
txt$=""
wait
[add]
'make sure no item is in selected state:
LVITEM.stateMask.struct = LVIS.SELECTED 'bit to set
LVITEM.state.struct = LVIS.UNSELECTED
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETITEMSTATE As long, _
-1 As long, _ 'change applies to all items
LVITEM As struct, _
r As long
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMCOUNT As long, _
0 As long, _ 'always 0
0 As long, _ 'always 0
count As long
name$="No Name"
prompt "Name?";name$
if name$="" then name$="No Name"
'insert next row, first column
LVITEM.mask.struct = LVIF.TEXT
LVITEM.iItem.struct = count 'next row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.pszText$.struct = name$
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.INSERTITEM As long, _
0 As long, _
LVITEM As struct, _
r As long
level$="No Level"
prompt "Level?";level$
if level$="" then level$="No Level"
'add second column to row
LVITEM.iItem.struct = count 'next row
LVITEM.iSubItem.struct = 1 'second column
LVITEM.pszText$.struct = level$
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.SETITEM As long, _
0 As long, _
LVITEM As struct, _
r As long
print #1.s, "List count: ";count+1
wait
[delete]'get user selection and delete
'get number of items in list:
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMCOUNT As long, _
0 As long, _ 'always 0
0 As long, _ 'always 0
total As long
for index = 0 to total-1 'check each row
LVITEM.mask.struct = LVIF.STATE
LVITEM.iItem.struct = index 'row
LVITEM.iSubItem.struct = 0 'first column
LVITEM.stateMask.struct = LVIS.SELECTED
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.GETITEMA As long, _
index As long, _ 'index of row
LVITEM As struct, _
r As long
state = LVITEM.state.struct 'selected state of item
if state and LVIS.SELECTED then
CallDLL #user32, "SendMessageA", _
hwndLV As long, _
LVM.DELETEITEM As long, _
index As long, _
LVITEM As struct, _
r As long
exit for
end if
next
print #1.s, "List count: ";total-1
wait
[quit]
calldll #MsgHook, "UnhookMsgHook", hHook as long, ret as void
close #MsgHook
calldll #user32, "DestroyWindow", _
hwndLV as long, re as long
' Close handles.
close #1:end
'Function to determine if a file exists
function fileExists(path$, filename$)
files path$, filename$, info$()
fileExists = val(info$(0, 0)) 'non zero is true
end function