I have a dialog box and a picture control (canvas) on that dialog box. I have a list of Images in my dialog box in a list box. I want to implement Drag & Drop feature in my application. I want the user be able to click on the Image with a mouse and then drag the Image to the canvas.
Handle the drag event in your dialog or the list. If your list is CListCtrl based use a LVN_BEGINDRAG handler. Otherwise use a WM_LBUTTONDOWN handler. From within that handler create a copy of the bitmap, cache it using the COleDataSource class and start the drag and drop operation:
// Get selected image into Bitmap here
stgm.tymed = TYMED_GDI;
stgm.hBitmap = static_cast<HBITMAP>(Bitmap.Detach());
stgm.pUnkForRelease = NULL;
// When moving is allowed pass DROPEFFECT_COPY | DROPEFFECT_MOVE
// here and delete the image when DoDragDrop returns DROPEFFECT_MOVE.
// Don't call default handler here when DoDragDrop has been called.
// Because OLE has handled all further mouse actions.
On the target side, use the COleDropTarget class. If the target is a CView derived class, it is simple to implement by adding a COleDropTarget member to the view, adding the virtual OnDrop... handlers and registering the view as drop target from OnInitialUpdate(). With other window types than CView based ones, you must derive your own window specific COleDropTarget class that knows your window class so that it can access the required functions and members.
From within the COleDropTarget::OnDrop[Ex] function, use the provided COleDataObject to get the data by calling GetData(CF_BITMAP, &stgm).
When using the MFC COle... classes, you must include afxole.h (e.g. in stdafx.h) and call AfxOleInit() from within InitInstance() of your Windows app class.
Last Visit: 31-Dec-99 18:00 Last Update: 21-Sep-14 11:02