Older Version Newer Version

ChrisIverson ChrisIverson Mar 24, 2008

===Drag and Drop using _WS_EX_ACCEPTFILES===

Please note: This program requires the WMLiberty DLL, available at Bay 6 Software:
http://www.b6sw.com/forum/content.php?mode=site&t=218

To use drag and drop, we do three things:

1. We set the window or control to accept files using the _WS_EX_ACCEPTFILES stylebit.  This uses a texteditor control, although it could be used with anything.
[[code format="vb"]]
stylebits #WIN.CTRL, 0, 0, _WS_EX_ACCEPTFILES, 0
texteditor #WIN.CTRL,  20,  27, 470, 290
[[code]]

2. We use WMLiberty to capture the _WM_DROPFILES message on the window/control.
[[code format="vb"]]
callback lpfnCallback, WMHandler(ULong, ULong, ULong, ULong), ULong

hCtrl = hwnd(#WIN.CTRL)
Open "WMLiberty" for DLL as #wm
CallDLL #wm, "SetWMHandler",_
hCtrl as ulong,_
_WM_DROPFILES as ulong,_
lpfnCallback as ulong,_
0 as long,_
ret as long  'If successful, ret=0
[[code]]

3. We use the Windows API to get the information about the dropped files.  We mainly use 2 functions: DragQueryFileA(), and DragFinish(), both of which are in Shell32.dll.  This code will get the number of files and loop through them, displaying each of their names in a texteditor.
[[code format="vb"]]
Function WMHandler(hWnd, uMsg, wParam, lParam)
    hDrop = wParam
    a = hexdec("FFFFFFFF")
    CallDLL #shell32, "DragQueryFileA",_   'Call DragQueryFile with 0xFFFFFFFF as the file number to get the number of files
    hDrop as ulong,_
    a as ulong,_
    0 as long,_
    0 as long,_
    ret as long

    #WIN.CTRL, "!cls"
    'Loop through the files and display their names
    For x = 0 to ret - 1
        buf$ = space$(1024)
        CallDLL #shell32, "DragQueryFileA",_
        hDrop as ulong,_
        x as ulong,_
        buf$ as ptr,_
        1024 as long,_
        ret as long

        #WIN.CTRL, trim$(buf$)
    Next x

    CallDLL #shell32, "DragFinish",_    'Free the memory used for the DragQueryFile array
    hDrop as ulong,_
    ret as long

    WMHandler = 0
End Function
[[code]]




A working demo(again, you need WMLiberty to use this):

[[code format="vb"]]
open "WMLiberty" for DLL as #wm

'Form created with the help of Freeform 3 v03-27-03
'Generated on Mar 24, 2008 at 12:01:29


[setup.m.Window]

    '-----Begin code for #m
    callback lpfnCallback, WMHandler(ULong, ULong, ULong, ULong), ULong
    nomainwin
    WindowWidth = 550
    WindowHeight = 410
    UpperLeftX=int((DisplayWidth-WindowWidth)/2)
    UpperLeftY=int((DisplayHeight-WindowHeight)/2)


    '-----Begin GUI objects code

    TexteditorColor$ = "white"
    stylebits #m.te, 0, 0, _WS_EX_ACCEPTFILES, 0
    texteditor #m.te,  20,  27, 470, 290

    '-----End GUI objects code

    '-----Begin menu code
    menu #m, "File", "Exit", QuitF
    menu #m, "Edit"  ' <-- Texteditor menu.


    '-----End menu code

    open "Drag and Drop Test" for window as #m
    print #m, "font ms_sans_serif 10"
    print #m, "trapclose Quit"

    hTe = hwnd(#m.te)

    CallDLL #wm, "SetWMHandler",_
    hTe as ulong,_
    _WM_DROPFILES as ulong,_
    lpfnCallback as ulong,_
    0 as long,_
    ret as long

[wait]
    scan
    calldll #kernel32, "Sleep", 50 as long, r as void
    goto [wait]


Sub Quit hndl$
    Close #hndl$
    Close #wm
    END
End Sub

Sub QuitF
    Call Quit "#m"
End Sub

Function WMHandler(hWnd, uMsg, wParam, lParam)
    hDrop = wParam
    a = hexdec("FFFFFFFF")
    CallDLL #shell32, "DragQueryFileA",_   'Call DragQueryFile with 0xFFFFFFFF as the file number to get the number of files
    hDrop as ulong,_
    a as ulong,_
    0 as long,_
    0 as long,_
    ret as long

    #m.te, "!cls"
    For x = 0 to ret - 1
        buf$ = space$(1024)
        CallDLL #shell32, "DragQueryFileA",_
        hDrop as ulong,_
        x as ulong,_
        buf$ as ptr,_
        1024 as long,_
        ret as long
        #m.te, trim$(buf$)
    Next x

    CallDLL #shell32, "DragFinish",_    'Free the memory used for the DragQueryFile array
    hDrop as ulong,_
    ret as long

    WMHandler = 0
End Function
[[code]]


[[user:thedarkfreak|1206389211]] (Chris Iverson)