DrgDrag - Example Code

This example uses the DrgDrag function to drag a single object in response to the direct-manipulation button being pressed while the pointer is over a drag object. The example shows the initialization of the DRAGITEM, DRAGINFO, and DRAGIMAGE structures used by the DrgDrag function.

#define INCL_WINSTDDRAG /* Direct Manipulation (Drag) Functions  */
#define INCL_WININPUT   /* Window Input Functions                */
#include <os2.h>

PDRAGINFO pdinfo;       /* Pointer to DRAGINFO structure         */
HWND      hwnd;         /* Handle of calling (source) window     */
BOOL      flResult;     /* Result indicator                      */
DRAGITEM  ditem;        /* DRAGITEM structure                    */
DRAGIMAGE dimg;         /* DRAGIMAGE structure                   */
HBITMAP   hbm;          /* Bit-map handle                        */
HWND      hwndDrop;     /* Handle of drop (target) 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;          /* X-offset of the origin of    */
                                 /* the image from the pointer   */
                                 /* hotspot                      */
    ditem.cyOffset = 0;          /* Y-offset of the origin of    */
                                 /* the image from the pointer   */
                                 /* hotspot                      */
    ditem.fsControl = 0;         /* Source item control flags    */
                                 /* object is open               */
    ditem.fsSupportedOps = 0;

    /*************************************************************/
    /* Create the DRAGINFO structure                             */
    /*************************************************************/
    pdinfo = DrgAllocDraginfo(1);
    if (!pdinfo) return (FALSE); /* If allocation fails,         */
                                 /* return FALSE                 */

    /*************************************************************/
    /* 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 bmp to*/
    dimg.sizlStretch.cy = 20L;
    dimg.fl = DRG_BITMAP |       /* Flags passed to DrgDrag      */
              DRG_STRETCH;       /* Stretch to size specified    */
                                 /* in sizlStretch               */
    dimg.cxOffset = 0;           /* Offset of the origin of      */
    dimg.cyOffset = 0;           /* the image from the pointer   */
                                 /* hotspot                      */
    /*************************************************************/
    /* Set the drag item                                         */
    /*************************************************************/
    flResult= DrgSetDragitem(pdinfo, &ditem, (ULONG)sizeof(ditem),
                             0);

    /*************************************************************/
    /* Perform the drag operation:                               */
    /* - Give the user a visual cue by changing the pointer to a */
    /*   bit map                                                 */
    /* - Send DM_DRAGOVER messages to the target window (in this */
    /*   case it is also the source)                             */
    /* NOTE: DrgDrag will fail if another window in the same     */
    /*       thread already has the capture.                     */
    /*************************************************************/
    hwndDrop = DrgDrag(hwnd,   /* Source of the drag             */
                pdinfo,        /* Pointer to DRAGINFO structure  */
               (PDRAGIMAGE)&dimg, /* Drag image                  */
                1,             /* Size of the pdimg array        */
                VK_ENDDRAG,    /* Release of direct-manipulation */
                               /* button ends the drag           */
                NULL);         /* Reserved                       */


[Back: DrgDrag - Related Functions]
[Next: DrgDrag - Topics]