Older Version Newer Version

eaglesoar 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