The source application includes the following files:

The following sample shows the source application code:

===============DRAGFROM.C
===============

/***********************************************************************/
/*  DRAGFROM.C - Drag source program                                   */
/*                                                                     */
/*  This program displays a list of files in the current directory.    */
/*  Drag any file name to EPM, and drop, and the file will be          */
/*  displayed in the editor.                                           */
/***********************************************************************/
#define INCL_DOSFILEMGR
#define INCL_WIN
#define INCL_WINSTDDRAG
#define INCL_WINLISTBOXES
#define INCL_WINWINDOWMGR

#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dragfrom.h"

/***********************************************************************/
/*  Global variables.                                                  */
/***********************************************************************/
HAB      hab;
char     szFormats[]  = "<DRM_OS2FILE, DRF_UNKNOWN>";
char     szFileNames[50][CCHMAXPATH];
HWND     hFrameWnd;
HWND     hListWnd;
PFNWP    SysWndProc;
PFNWP    ListWndProc;
HPOINTER hptrFile;

/***********************************************************************/
/*  Function prototypes.                                               */
/***********************************************************************/
MRESULT EXPENTRY LocalWndProc(HWND, ULONG, MPARAM, MPARAM);
MRESULT EXPENTRY LocalListProc(HWND, ULONG, MPARAM, MPARAM);
BOOL DoDrag(void);
void LoadList(void);

/***********************************************************************/
/*   Main() - program entry point.                                     */
/***********************************************************************/
int main(void)
{
   FRAMECDATA   fcd;
   HMQ          hmq;
   QMSG         qmsg;

   if (!(hab = WinInitialize (0)))
     return FALSE;

   hmq = WinCreateMsgQueue (hab, 0);

   if (!hmq)
   {
      WinTerminate(hab);
      return FALSE;
   }

/***********************************************************************/
/*  Setup the frame control data for the frame window.                 */
/***********************************************************************/
   fcd.cb = sizeof(FRAMECDATA);
   fcd.flCreateFlags = FCF_TITLEBAR        |
                       FCF_SYSMENU         |
                       FCF_SIZEBORDER      |
                       FCF_SHELLPOSITION   |
                       FCF_MINMAX          |
                       FCF_TASKLIST;

   fcd.hmodResources = NULLHANDLE;

/***********************************************************************/
/*  Set our resource key (so PM can find menus, icons, etc).           */
/***********************************************************************/
   fcd.idResources = DRAGFROM;

/***********************************************************************/
/*  Create the frame - it will hold the list box.                      */
/***********************************************************************/
   hFrameWnd = WinCreateWindow(HWND_DESKTOP,
                               WC_FRAME,
                               "Drag Source",
                               0, 0, 0, 0, 0,
                               NULLHANDLE,
                               HWND_TOP,
                               DRAGFROM,
                               &fcd,
                               NULL);

/***********************************************************************/
/*  Verify that the frame was created; otherwise, stop.                */
/***********************************************************************/
   if (!hFrameWnd)
     return FALSE;

/***********************************************************************/
/*  Set an icon for the frame window.                                  */
/***********************************************************************/
   WinSendMsg(hFrameWnd,
              WM_SETICON,
              (MPARAM)WinQuerySysPointer(HWND_DESKTOP,
                                         SPTR_FOLDER,
                                         FALSE),
               NULL);

/***********************************************************************/
/*  Create a list window child - we willl list files in it.            */
/***********************************************************************/
   hListWnd = WinCreateWindow(hFrameWnd,
                              WC_LISTBOX,
                              NULL,
                              0, 0, 0, 0, 0,
                              hFrameWnd,
                              HWND_BOTTOM,
                              FID_CLIENT,
                              NULL,
                              NULL);

/***********************************************************************/
/*  We must intercept the frame window's messages.                     */
/*  We save the return value (the current WndProc),                    */
/*  so we can pass it all the other messages the frame gets.           */
/***********************************************************************/
   SysWndProc  = WinSubclassWindow(hFrameWnd, (PFNWP)LocalWndProc);
   ListWndProc = WinSubclassWindow (hListWnd, (PFNWP)LocalListProc);

   WinShowWindow(hFrameWnd, TRUE);
   WinPostMsg(hFrameWnd, WM_LOAD_LIST, 0, 0);

/***********************************************************************/
/*  Main message loop.                                                 */
/***********************************************************************/
   while (WinGetMsg (hab, &qmsg, 0L, 0, 0))
     WinDispatchMsg (hab, &qmsg);

   WinDestroyWindow (hFrameWnd);
   WinDestroyMsgQueue (hmq);
   WinTerminate (hab);
}

/***********************************************************************/
/*  LocalWndProc() - intercepts frame window messages.                 */
/***********************************************************************/
MRESULT EXPENTRY LocalWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
{
   switch (msg)
   {
      /* Post a message to fill the list box */
      case WM_LOAD_LIST:
         LoadList();
         break;

      case WM_DESTROY:
         WinDestroyPointer (hptrFile);
          break;

      case WM_STARTDRAG:
         DoDrag();
         break;

      default:
         return (*SysWndProc)(hwnd, msg, mp1, mp2);
         break;
   }
   return FALSE;
}

/***********************************************************************/
/*  LocalListProc() - List box subclassing                             */
/*  (all we care about is starting a drag).                            */
/***********************************************************************/
MRESULT EXPENTRY LocalListProc(HWND hwnd,
                               ULONG msg,
                               MPARAM mp1,
                               MPARAM mp2)

{
   if (msg == WM_BUTTON2DOWN)
   {
      WinPostMsg(hFrameWnd, WM_STARTDRAG, mp1, 0);
      return (MRESULT)FALSE;
   }
   else
      return (*ListWndProc)(hwnd, msg, mp1, mp2);
}

/***********************************************************************/
/*  DoDrag() - the actual drag function.                               */
/***********************************************************************/
BOOL DoDrag ()
{
   char             szBuffer[CCHMAXPATH];
   char             szDir[256];
   SHORT            index, len;
   HWND             hTargetWnd;
   LHANDLE          hImage;

   DRAGITEM         Dragitem;
   HSTR             hstrType, hstrRMF, hstrContainer;
   CHAR             szItemName[64];
   CHAR             szContainer[CCHMAXPATH];
   PDRAGINFO        pSourceDraginfo;
   DRAGIMAGE        dimg;
   ULONG            dirlen;

/***********************************************************************/
/*  Get the file name from the listbox.                                */
/***********************************************************************/
   index = WinQueryLboxSelectedItem(hListWnd);
   len   = WinQueryLboxItemTextLength(hListWnd, index);
   WinQueryLboxItemText(hListWnd,
                        index,
                        szBuffer,
                        len);
   szBuffer[len] = '\0';

/***********************************************************************/
/*  Allocate the DRAGINFO data structure.                              */
/***********************************************************************/
   pSourceDraginfo = DrgAllocDraginfo(1);

/***********************************************************************/
/*  Define file type as unknown.                                       */
/***********************************************************************/
   hstrType  = DrgAddStrHandle (DRT_UNKNOWN);
   hstrRMF   = DrgAddStrHandle (szFormats);         /* OS2file unknown */

/***********************************************************************/
/*  Get our current directory for the container name.                  */
/***********************************************************************/
   dirlen                     = CCHMAXPATH-1;
   DosQueryCurrentDir(0, szDir, &dirlen);
   sprintf(szContainer, "\\%s\\", szDir);
   hstrContainer              = DrgAddStrHandle(szContainer);
   Dragitem.hwndItem          = hListWnd;
   Dragitem.hstrType          = hstrType;

   Dragitem.hstrRMF           = hstrRMF;
   Dragitem.hstrContainerName = hstrContainer;
   Dragitem.fsControl         = 0;
   Dragitem.fsSupportedOps    = DO_COPYABLE | DO_MOVEABLE;
   Dragitem.hstrSourceName    = DrgAddStrHandle (szBuffer);
   Dragitem.hstrTargetName    = Dragitem.hstrSourceName;
   Dragitem.ulItemID          = index;

/***********************************************************************/
/*  Set info, prepare for drag.                                        */
/***********************************************************************/
   DrgSetDragitem(pSourceDraginfo,
                  &Dragitem,
                  sizeof(DRAGITEM),
                  0);

/***********************************************************************/
/*  Initialize the drag image.                                         */
/***********************************************************************/
   dimg.cb       = sizeof (DRAGIMAGE);
   dimg.hImage   = WinQuerySysPointer (HWND_DESKTOP, SPTR_FILE, FALSE);
   dimg.fl       = DRG_ICON | DRG_TRANSPARENT;
   dimg.cxOffset = 0;
   dimg.cyOffset = 0;

   pSourceDraginfo->hwndSource = hFrameWnd;

/***********************************************************************/
/*  Start drag operation.                                              */
/***********************************************************************/
   DrgDrag(hFrameWnd,
           pSourceDraginfo,
           &dimg,
           1L,
           VK_BUTTON2,
           NULL);

   return TRUE;
}

/***********************************************************************/
/*  LoadList().                                                        */
/***********************************************************************/
void LoadList(void)
{
   char          szDir[CCHMAXPATH];
   FILEFINDBUF3  ffbFile;
   HDIR          hDir;
   int           rc, x;
   ULONG         dirlen;
   ULONG         count;

/***********************************************************************/
/*  We use a DosFindFirst/DosFindNext loop to fill the list box.       */
/***********************************************************************/
   hDir  = HDIR_CREATE;
   count = 1;
   rc = DosFindFirst("*.*",
                     &hDir,
                     0,
                     &ffbFile,
                     sizeof(FILEFINDBUF3),
                     &count,
                     FIL_STANDARD);

   x = 0;
   do
   {
      sprintf(szFileNames[x], "%s", ffbFile.achName);

      WinPostMsg(hListWnd,
                 LM_INSERTITEM,
                 MPFROMSHORT(LIT_END),
                 szFileNames[x]);
      count = 1;
      x++;

      rc = DosFindNext(hDir,
                       &ffbFile,
                       sizeof(FILEFINDBUF3),
                       &count);
   }
   while (count && (x < 50));

   DosFindClose(hDir);
}

===============
DRAGFROM.H
===============
#define DRAGFROM      100
#define WM_STARTDRAG  WM_USER+100
#define WM_LOAD_LIST  WM_USER+110

===============
DRAGFROM.DEF
===============
NAME            DRAGFROM WINDOWAPI

PROTMODE
HEAPSIZE        8192
STACKSIZE       32768
EXPORTS         LocalWndProc
                LocalListProc

===============
DRAGFROM.LNK
===============
dragfrom.obj
dragfrom.exe
dragfrom.map
dragfrom.def

===============
DRAGFROM.MAK
===============

CC      = icc /c /Ge /Gd- /Se /Re /ss /Gm+
LINK    = link386
HEADERS = dragfrom.h

#----------------------------------------------------------------------
#  A list of all of the object files.
#----------------------------------------------------------------------
ALL_OBJ1 = dragfrom.obj

all: dragfrom.exe

dragfrom.obj: dragfrom.c $(HEADERS)

dragfrom.exe: $(ALL_OBJ1) dragfrom.def dragfrom.lnk
              $(LINK) @dragfrom.lnk


[Back] [Next]