User Tools

Site Tools


receiving_20dropped_20files

This is an old revision of the document!


Receiving dropped files

by Richard Russell, June 2010

The article Opening a file by dropping or clicking describes how you can handle a file which is dragged-and-dropped onto your program's icon. Another way of receiving files is as a result of the user dropping them onto your program's window rather than onto its icon. This article describes how to do that.

Firstly some initialisation is required:

      WM_DROPFILES = &233
      *SYS 1
      MaxDroppedFiles% = 100
      DIM DroppedFile$(MaxDroppedFiles%-1), DroppedAt{x%,y%}
      Dropped% = 0
      ON SYS PROCsys(@msg%, @wparam%, @lparam%) : RETURN
      SYS "DragAcceptFiles", @hwnd%, 1

Once this code has been executed, a file (or files) being dropped onto your program's window will result in an ON SYS interrupt with the @msg% value being WM_DROPFILES.

In your 'main loop' you will want to monitor the value of Dropped% to determine whether any files have been dropped onto your window. If one or more files has been dropped, you can discover the filenames from the array DroppedFile$(). If you need to know where the files were dropped (for example your program performs a different action as a result) the coordinates DroppedAt.x% and DroppedAt.y% are in pixels measured from the top-left corner of your window. Here is a simple example of the kind of code needed:

      REPEAT
        WAIT 1
        IF Dropped% THEN
          PRINT "Number of files dropped = ";Dropped%
          FOR I% = 0 TO Dropped%-1
            IF I% >= MaxDroppedFiles% THEN EXIT FOR
            PRINT "File ";I%;" is """ DroppedFile$(I%) """"
          NEXT I%
          PRINT "The files were dropped at x=";DroppedAt.x%;", y=";DroppedAt.y%
          Dropped% = 0
        ENDIF
      UNTIL FALSE
      END

Here the information about the dropped files is simply printed to the screen, but in practice you are likely to want to do something different!

Finally, here is the ON SYS handler for processing the WM_DROPFILES message:

      DEF PROCsys(M%,W%,L%)
      CASE M% OF
        WHEN WM_DROPFILES:
          LOCAL B%, I%
          DIM B% LOCAL 260
          SYS "DragQueryFile", W%, -1, 0, 0 TO Dropped%
          IF Dropped% <> 0 THEN
            FOR I% = 0 TO Dropped%-1
              IF I% >= MaxDroppedFiles% THEN EXIT FOR
              SYS "DragQueryFile", W%, I%, B%, 260
              DroppedFile$(I%) = $$B%
            NEXT I%
          ENDIF
          SYS "DragQueryPoint", W%, DroppedAt{}
          SYS "DragFinish", W%
      ENDCASE
      ENDPROC

Needless to say, if there are other ON SYS interrupts that need to be handled by your program (e.g. menu selections, button clicks etc.) then you must add the necessary code to this handler (probably in a WHEN WM_COMMAND: clause).

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
receiving_20dropped_20files.1522502377.txt.gz · Last modified: 2024/01/05 00:16 (external edit)