The target application includes the following files:
The following sample shows the target application code:
================TARGET.C ================ #define INCL_WIN #define INCL_GPI #include <os2.h> #include "target.h" #pragma linkage (main,optlink) INT main(VOID); /***********************************************************************/ /* Main() - program entry point. */ /* This program accepts drops from EPM. */ /***********************************************************************/ MRESULT EXPENTRY LocalWndProc(HWND, ULONG, MPARAM, MPARAM); HAB hab; HWND hFrameWnd; PFNWP SysWndProc; INT main (VOID) { HMQ hmq; HPOINTER hPtr; FRAMECDATA fcd; QMSG qmsg; if (!(hab = WinInitialize(0))) return FALSE; if (!(hmq = WinCreateMsgQueue(hab, 0))) return FALSE; /***********************************************************************/ /* Set up 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; fcd.idResources = 0; /***********************************************************************/ /* Create the frame window. */ /***********************************************************************/ hFrameWnd = WinCreateWindow(HWND_DESKTOP, WC_FRAME, "Target", 0, 0, 0, 0, 0, NULLHANDLE, HWND_TOP, 0, &fcd, NULL); /***********************************************************************/ /* Verify that the frame was created; otherwise, stop. */ /***********************************************************************/ if (!hFrameWnd) return FALSE; hPtr = WinLoadPointer(HWND_DESKTOP, NULLHANDLE, TRASHCAN); /***********************************************************************/ /* Set an icon for the frame window. */ /***********************************************************************/ WinSendMsg(hFrameWnd, WM_SETICON, (MPARAM)hPtr, NULL); /***********************************************************************/ /* We must intercept the frame window's messages */ /* (to capture any input from the container control). */ /* 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); WinShowWindow(hFrameWnd, TRUE); /***********************************************************************/ /* Standard PM message loop - get it, dispatch it. */ /***********************************************************************/ while (WinGetMsg(hab, &qmsg, NULLHANDLE, 0, 0)) WinDispatchMsg(hab, &qmsg); /***********************************************************************/ /* Clean up on the way out. */ /***********************************************************************/ WinDestroyMsgQueue(hmq); WinTerminate(hab); return TRUE; } /***********************************************************************/ /* LocalWndProc() - window procedure for the frame window. */ /* Called by PM whenever a message is sent to the frame. */ /***********************************************************************/ MRESULT EXPENTRY LocalWndProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { char szDir[CCHMAXPATH]; char szBuffer[256]; PDRAGINFO dragInfo; PDRAGITEM dragItem; USHORT usOp; USHORT usIndicator, cItems, i; ULONG ulBytes; switch(msg) { /***********************************************************************/ /* Someone's dragging an object over us. */ /***********************************************************************/ case DM_DRAGOVER: dragInfo = (PDRAGINFO)mp1; /* Get access to the DRAGINFO data structure */ DrgAccessDraginfo(dragInfo); /* Can we accept this drop? */ switch (dragInfo->usOperation) { /* Return DOR_NODROPOP if current operation */ /* is link or unknown */ case DO_UNKNOWN: DrgFreeDraginfo(dragInfo); return (MRFROM2SHORT (DOR_NODROPOP, 0)); break; /* Our default operation is Move */ case DO_DEFAULT: dragItem = DrgQueryDragitemPtr(dragInfo, 0); ulBytes = DrgQueryStrName(dragItem->hstrContainerName, sizeof(szDir), szDir); if (!ulBytes) return (MRFROM2SHORT (DOR_NODROPOP, 0)); else usOp = DO_MOVE; break; /* Do the requested specific operation */ case DO_MOVE: case DO_COPY: usOp = dragInfo->usOperation; break; } usIndicator = DOR_DROP; cItems = DrgQueryDragitemCount(dragInfo); /* Now, we need to look at each item in turn */ for (i = 0; i < cItems; i++) { dragItem = DrgQueryDragitemPtr(dragInfo, i); /* Make sure we can move for a Move request */ /* or copy for a Copy */ if (((dragItem->fsSupportedOps & DO_COPYABLE) && (usOp == (USHORT)DO_COPY)) || ((dragItem->fsSupportedOps & DO_MOVEABLE) && (usOp == (USHORT)DO_MOVE))) { /* Check the rendering format */ if (DrgVerifyRMF(dragItem, "DRM_OS2FILE", "DRF_UNKNOWN")) usIndicator = DOR_DROP; else usIndicator = DOR_NEVERDROP; } else usIndicator = DOR_NODROPOP; } /* Release the draginfo data structure */ DrgFreeDraginfo(dragInfo); return (MRFROM2SHORT(usIndicator, usOp)); break; /* Dragged object just left */ case DM_DRAGLEAVE: return (MRESULT)FALSE; break; /* Drop the object on us (receive the object) */ case DM_DROP: /* Get access to the DRAGINFO data structure */ DrgAccessDraginfo(dragInfo); /* Can we accept this drop? */ switch (dragInfo->usOperation) { /* Return DOR_NODROPOP if current operation */ /* is link or unknown */ case DO_UNKNOWN: DrgFreeDraginfo(dragInfo); return (MRFROM2SHORT (DOR_NODROPOP, 0)); break; /* Our default operation is Move */ case DO_DEFAULT: dragItem = DrgQueryDragitemPtr(dragInfo, 0); ulBytes = DrgQueryStrName(dragItem->hstrContainerName, sizeof(szDir), szDir); if (!ulBytes) return (MRFROM2SHORT (DOR_NODROPOP, 0)); usOp = (USHORT)DO_MOVE; break; /* Do the requested specific operation */ case DO_MOVE: case DO_COPY: usOp = dragInfo->usOperation; break; } usIndicator = DOR_DROP; cItems = DrgQueryDragitemCount(dragInfo); /* Now, we need to look at each item in turn */ for (i = 0; i < cItems; i++) { dragItem = DrgQueryDragitemPtr(dragInfo, i); /* Make sure we can move for a Move request */ /* or copy for a Copy */ if (((dragItem->fsSupportedOps & DO_COPYABLE) && (usOp == (USHORT)DO_COPY)) || ((dragItem->fsSupportedOps & DO_MOVEABLE) && (usOp == (USHORT)DO_MOVE))) { /* Check the rendering format */ if (DrgVerifyRMF(dragItem, "DRM_OS2FILE", "DRF_UNKNOWN")) usIndicator = DOR_DROP; else usIndicator = DOR_NEVERDROP; } else usIndicator = DOR_NODROPOP; /***********************************************************************/ /* This is where we would actually move or copy the file, */ /* but we just display the name instead. */ /***********************************************************************/ DrgQueryStrName(dragItem->hstrSourceName, 255, szBuffer); WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szBuffer, "Dropped", 0, MB_OK); } /* Release the draginfo data structure */ DrgFreeDraginfo(dragInfo); return (MRFROM2SHORT(usIndicator, usOp)); break; /* Send the message to the usual WC_FRAME WndProc */ default: return (*SysWndProc)(hwnd, msg, mp1, mp2); break; } return (*SysWndProc)(hwnd, msg, mp1, mp2); } ================ TARGET.RC ================ #include <os2.h> #include "target.h" ICON TRASHCAN trashcan.ico ================ TARGET.H ================ #define TRASHCAN 100 ================ TARGET.DEF ================ NAME TARGET WINDOWAPI DESCRIPTION 'PM Drag and Drop Sample' CODE MOVEABLE DATA MOVEABLE MULTIPLE STACKSIZE 24576 HEAPSIZE 10240 PROTMODE ================ TARGET.LNK ================ target.obj target.exe target.map target.def