The information in this article applies to:
SUMMARY
In a Microsoft Foundation Classes (MFC) application, you may want to enable
the user to drag text between various windows, including those in
CWnd-derived objects as well as standard control windows in CListBox and
CEdit-derived objects.
http://www.microsoft.com/downloads/search.aspand then click How to use the Microsoft Download Center. MORE INFORMATION
To enable OLE for a pre-existing MFC application, you must initialize the
OLE DLLs. This is done in the InitInstance() of your application object by
calling AfxOleInit().
To turn a CWnd-derived object into a drop source, you must instantiate a COleDataSource object in your CWnd-derived object. You can then call COleDataSource::CacheGlobalData() to cache the data (text) that you are going to drag. Then call COleDataSource::DoDragDrop() to actually initiate the drag drop. The return value from DoDragDrop() gives you the result of the drag/drop operation. The DROPEFFECT return value from DoDragDrop() is a bit field, so you have to test specific bits of the return value to determine the drag/drop results. Turning a CWnd-derived object into a drop target is a bit more complicated. You must derive your own class from COleDropTarget, and instantiate a member of your COleDropTarget-derived object in the CWnd-derived class. In your COleDropTarget object you have to, at a minimum, override these four member functions: COleDropTarget::OnDragEnter()You must also initialize the COleDropTarget derived object as a drop target with the OLE DLLs by calling COleDropTarget::Register(). This would normally be done in the OnCreate member function of a CWnd-derived object (see the CDDWnd::OnCreate method in LSTDRG). A problem in dialog template created classes (CListBox, CEdit, and so on created by AppStudio) is that OnCreate is not called. This is because control windows associated with the dialog template are created during the dialog creation process before their actual CWnd-derived C++ objects are created. These windows are then attached by using Attached() to the C++ CWnd-derived objects once they are created. To work around this, an Initialize() method was created for the CListBox and CEdit-derived classes where COleDropTarget::Register() is called. This Initialize() method is then called for each template-created control in the CFormView-derived classes OnInitialUpdate() method (see CListdragView::OnInitialUpdate() and CDDListBox::Initialize()). Another interesting aspect of the LSTDRG application is the use of a burning trashcan animation when text is dropped on a window. This animation uses a single bitmap composed of multiple 'cells' or images. The use of a single bitmap as opposed to multiple bitmaps conserves GDI resources and is more efficient to paint. It also turns off the mouse pointer (cursor) by loading an empty pointer during painting to eliminate pointer flicker on Windows version 3.x computers. REFERENCES
"MFC 2.5 OLE 2 Classes" reference book, available in the Books Online of
Visual C++ version 1.5. See sections on drag and drop beginning with the
section titled "Drag and Drop." Also review the COleDataSource class and
the COleDataTarget class in the same reference book.
Additional query words: kbvc150 kbvc151 kbvc152 kbvc200 kbvc210 kbvc220 kbvc400 kbvc410 kbvc420 kbvc500 kbvc600
Keywords : kbfile kbole kbprg kbsample kbMFC kbVC |
Last Reviewed: December 11, 1999 © 2000 Microsoft Corporation. All rights reserved. Terms of Use. |