Solved

COleDropSource - How to implement

Posted on 1998-07-06
6
881 Views
Last Modified: 2008-02-01
I have written a control derived from CWnd and I'm trying to implement drag and drop between two instances of it.

I have tried adding a COleDropTarget derived member variable and calling member.Register(this) in the control's OnCreate handler. For some reason the Register function returns 0 (failure) and the overidden OnDrag functions don't get called!

Any ideas? According to the documentation, I can use a COleDropTarget in a non-CView derived class. Why is failing? What must I do?

Ignore that question - I figured it out - It was the AfxOleInit that was missing.

One more question...

How do you implement the COleDataSource part.
My data will be a text string for now - Max length about 250-500 characters.

I only need CF_TEXT format to start, but I'd like to know how to use my own data format too.

Cheers
0
Comment
Question by:richweed
  • 4
  • 2
6 Comments
 
LVL 7

Accepted Solution

by:
galkin earned 100 total points
ID: 1167241
I don't understand why you need to implement COleDropSource class. It wraps IDropInterface that allows you get feedback during drag and drop operation. You need to declare on stack where you want to implement drag and drop COleDataObject class instance. Then you need to create data object. Allocate memory block large enogh for your text data with GlobalAlloc. Lock it with GlobalLock. Copy text to allocated memory. Then call COleDataObject::CachGlobalData passing handle to global memro you allocated and locked. Next step is call to COleDataObject::DoDragDrop. Last default parameter is pointer to COleDropSource class. you can derive you own class from COleDropSource and override its virtual functions which will be called during drag and drop. DoDragDrop enters modal loop until drop occurs or drag and drop operation is cancelled.
Finally you need to unlock and free memory with GlobalUnlock and GlobalFree. If you want to use your own format you need first to register it with COleDataObject::RegisterClipboardFormat
0
 

Author Comment

by:richweed
ID: 1167242
Galkin
I'm not using a text string anymore, but my FVInfo data structure instead. (IMAGEBARINFO FVInfo)
Is this code correct?

      COleDataSource MyDataSource;
      HGLOBAL hMyBlock = GlobalAlloc(GMEM_FIXED, sizeof (IMAGEBARINFO));
      IMAGEBARINFO* pMyBlock = (IMAGEBARINFO*) GlobalLock(hMyBlock);

      CopyMemory(pMyBlock,&FVInfo,sizeof(FVInfo)); //Is this correct?
      MyDataSource.CacheGlobalData(m_cfIB_CBFormat,hMyBlock);
      MyDataSource.DoDragDrop(DROPEFFECT_COPY);

      GlobalUnlock(hMyBlock);
      GlobalFree(hMyBlock);

Do I use the same code for normal copy/paste operations? If not, how is it different? (besides not calling dodragdrop)
0
 
LVL 7

Expert Comment

by:galkin
ID: 1167243
Yes, you allocate global memory with GlobalAlloc for your structure, lock it with GlobalLock. given a pointer to allocated memory you copy your structure. Then you register custom clipboard format with RegisterClipboardFormat. After that you call CacheGlobalData and DoDragDrop.
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 7

Expert Comment

by:galkin
ID: 1167244
You code looks correct
0
 

Author Comment

by:richweed
ID: 1167245
Here is my drop code:

      HGLOBAL hMyBlock = pDataObject->GetGlobalData(m_cfIB_CBFormat);
      LPVOID pMyBlock = GlobalLock(hMyBlock);
      CopyMemory(&I,pMyBlock,sizeof(I));
      GlobalUnlock(hMyBlock);

Is thist correct? Do I have to free the memory block myself or is it done by the DataObject?



What about Copy/Paste Clipboard operations?

      COleDataSource MyDataSource;
      HGLOBAL hMyBlock = GlobalAlloc(GMEM_FIXED, sizeof (x));
      LPVOID pMyBlock = GlobalLock(hMyBlock);

      CopyMemory(pMyBlock,&x,sizeof(x));
      MyDataSource.CacheGlobalData(m_cfIB_CBFormat,hMyBlock);
      MyDataSource.SetClipboard;

      GlobalUnlock(hMyBlock);
      GlobalFree(hMyBlock);   Is it correct to free the memory block now?

0
 
LVL 7

Expert Comment

by:galkin
ID: 1167246
your code is correct and you have to unlock and free global memory
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now