This example shows a direct manipulation operation between two windows. The actual operation, copying the CONFIG.SYS file to C:\OS2\CONFIG.SYS, is visually represented by a drag and drop of an icon.
#define INCL_GPIBITMAPS /* GPI Bit Map Functions */
#define INCL_WINSTDDRAG /* Direct Manipulation (Drag) Functions */
#define INCL_DOSFILEMGR /* File Management Functions */
#define INCL_WININPUT /* Window Input Functions */
#include <os2.h>
#include <string.h>
#define ID_WINDOW 255
#define ID_ITEM 256
#define ID_BITMAP 257 /* .rc file: "bitmap 257 drgimage.bmp" */
HPS hps; /* Presentation space handle */
BOOL flResult;
HAB hab;
PDRAGINFO pdinfo;
DRAGITEM ditem;
DRAGIMAGE dimg;
PDRAGITEM pditem;
HBITMAP hbm; /* Bit-map handle */
HPOINTER hptr; /* Pointer bit-map handle */
HWND hwndDrop;
HWND hwnd;
MPARAM mp1;
char szBuffer[32]; /* Buffer where intersection string */
/* is returned */
char szSource[32];
char szTarget[32];
/*****************************************************************/
/* Inside ClientWindowProc of Source Window */
/*****************************************************************/
case WM_BEGINDRAG:
/*****************************************************************/
/* Initialize the DRAGITEM structure */
/*****************************************************************/
ditem.hwndItem = hwnd; /* Conversation partner */
ditem.ulItemID = ID_ITEM; /* Identifies item being dragged */
ditem.hstrType = DrgAddStrHandle(DRT_TEXT); /* Text item */
ditem.hstrRMF = DrgAddStrHandle("<DRM_OS2FILE,DRF_TEXT>");
ditem.hstrContainerName = DrgAddStrHandle("C:\\");
ditem.hstrSourceName = DrgAddStrHandle("C:\\CONFIG.SYS");
ditem.hstrTargetName = DrgAddStrHandle("C:\\OS2\\CONFIG.SYS");
ditem.cxOffset = 0; ditem.cyOffset = 0;
ditem.fsControl = 0; ditem.fsSupportedOps = 0;
/*****************************************************************/
/* Create the DRAGINFO structure */
/*****************************************************************/
pdinfo = DrgAllocDraginfo(1);
/*****************************************************************/
/* Initialize the DRAGIMAGE structure */
/*****************************************************************/
dimg.cb = sizeof(DRAGIMAGE); /* Size control block */
dimg.cptl = 0;
dimg.hImage = hbm; /* Image handle passed to */
/* DrgDrag */
dimg.sizlStretch.cx = 20L; /* Size to stretch ico or */
dimg.sizlStretch.cy = 20L; /* bmp to */
dimg.fl = DRG_BITMAP |
DRG_STRETCH; /* Stretch to size specified */
dimg.cxOffset = 0; /* Offset of the origin of the */
dimg.cyOffset = 0; /* image from the pointer */
/* hotspot */
flResult= DrgSetDragitem(pdinfo, &ditem, (ULONG)sizeof(ditem), 0);
/*****************************************************************/
/* Perform the drag operation: */
/*****************************************************************/
hwndDrop = DrgDrag(hwnd, /* Source of the drag */
pdinfo, /* Pointer to DRAGINFO structure */
(PDRAGIMAGE)&dimg, /* Drag image */
1, /* Size of the pdimg array */
VK_ENGDRAG, /* Release of drag button */
/* terminates the drag */
NULL); /* Reserved */
/*****************************************************************/
/* Inside ClientWindowProc of Target Window */
/*****************************************************************/
case DM_DRAGOVER:
pdinfo = MPFROMP(mp1);
pditem = DrgQueryDragitemPtr(pdinfo,0);
flResult = DrgVerifyTrueType(pditem,"DRF_TEXT");
if(!flResult)
/*****************************************************************/
/* Inform the application that you will accept the drop */
/*****************************************************************/
return(MRFROM2SHORT(DOR_DROP,DO_COPY));
case DM_DROP:
pdinfo = MPFROMP(mp1);
pditem = DrgQueryDragitemPtr(pdinfo,0);
/*****************************************************************/
/* Perform the operation represented by the direct manipulation */
/*****************************************************************/
DrgQueryStrName(pditem->hstrSourceName,sizeof(szSource),szSource);
DrgQueryStrName(pditem->hstrTargetName,sizeof(szTarget),szTarget);
flResult = DosCopy(szSource,szTarget,0L);
/*****************************************************************/
/* If operation is successful, return DMFL_TARGETSUCCESSFUL */
/*****************************************************************/
if(!flResult)
{
DrgSendTransferMsg(pditem->hwndItem,
DM_ENDCONVERSATION,
MPFROMLONG(pditem->ulItemID),
MPFROMLONG(DMFL_TARGETSUCCESSFUL));
}
/*****************************************************************/
/* Otherwise, return DMFL_TARGETFAIL */
/*****************************************************************/
else
{
DrgSendTransferMsg(pditem->hwndItem,
DM_ENDCONVERSATION,
MPFROMLONG(pditem->ulItemID),
MPFROMLONG(DMFL_TARGETFAIL));
}