15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Drag and Drop

ken k.p. pawliw -- pawliw@nortel.ca
Monday, June 10, 1996

Environment Visual C++4.0 Windows 95

I'd like to know the procedure required to drop a filename, from a CListView in 
my application, to the Explorer. Actually, what I really need to know, in my 
application, is the full pathname of the directory in the Explorer that would 
be the potential drop source.

I have checked through various books, archives, ect. and have not been able to 
retrieve any information regarding this problem. Any help would be greatly 
appreciated.

Thanks,
Ken Pawliw
pawliw@bnr.ca



David McGaffin -- dmcgaffi@mail1.videoserver.com
Tuesday, June 11, 1996


Ken,

Rather than trying to do the whole drop yourself, use OLE drag and drop.   
I can't cover the whole process in an email message, but you start by   
deriving a class from IDropSource as shown below.  You'll also need to   
derive a class from IDataObject which provides access to the data type   
you want to drop (e.g., CF_HDROP).  You can use the IDataObject Viewer   
utility provided with VC 4.0 to view the data types supported by the   
Explorer.  It's not as difficult as it might sound.  OLE will do most of   
the work for you once you've implemented a few member functions in the   
aforementioned classes.

To get a comprehensive description of OLE drag and drop, either go to the   
related chapter in Brockschmidt or wait until October or so and look for   
David Platt's _Essence of OLE_ in your favorite bookstore.

 - David McGaffin
dmcgaffin@videoserver.com

#include 

class CDropSource : public IDropSource
{
    protected:
        ULONG                m_RefCount ;

    public:
        CDropSource(void);
        ~CDropSource(void);

        //IDropSource interface members
        STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
        STDMETHODIMP_(ULONG) AddRef(void);
        STDMETHODIMP_(ULONG) Release(void);

        STDMETHODIMP QueryContinueDrag(BOOL, DWORD);
        STDMETHODIMP GiveFeedback(DWORD);
};

typedef CDropSource FAR *LPCDropSource;



 ----------
From:  mfc-l[SMTP:mfc-l@netcom.com]
Sent:  Tuesday, June 11, 1996 5:08 AM
To:  mfc-l
Subject:  Drag and Drop

Environment Visual C++4.0 Windows 95

I'd like to know the procedure required to drop a filename, from a   
CListView
in
my application, to the Explorer. Actually, what I really need to know, in   
my
application, is the full pathname of the directory in the Explorer that   
would
be the potential drop source.

I have checked through various books, archives, ect. and have not been   
able
to
retrieve any information regarding this problem. Any help would be   
greatly
appreciated.

Thanks,
Ken Pawliw
pawliw@bnr.ca




Wolfgang Loch -- Wolfgang.Loch@RZ.TU-Ilmenau.DE
Saturday, June 15, 1996

VC++2.0, NT3.51

>David McGaffin wrote:
> 
> Rather than trying to do the whole drop yourself, use OLE drag and drop.

I think, having the same problem like Ken.
The only thing we wanna do is to drag files (no OLE objects).
Q105530 says: "The supported method for creating a drag and drop server
is to use OLE version 2.0." and I'd like to use MFC (not the IDropSource
interface)
So I want to do something like this:

void CFileListBox::OnLButtonDown(..)
{
	COLEDataSource src;
	// ? put the selected filename to src
	DROPEFFECT de = src.DoDragDrop();
	switch( de )
	{
		:
	}
}

The problem is: How can I insert filenames to a COLEDataSource object?
Can anyone help ?
thanks,
	Wolfgang.



Neal Stublen -- nstublen@syncro.com
Monday, June 24, 1996

An old MSJ article by Jeffrey Richter discusses the undocumented
structures used by the Dragxxx API functions and implements a sample
dropfile server, allowing the sourcing of drag-and-drop files.  I don't
know if the method will work under Windows NT 3.51 since this is the
method employed by the Windows 3.1 File Manager, but perhaps it's worth
a look.

The article can be found on MSDN; the article's title is "Drop
Everything: How to Make Your Application Accept and Source Drag-and-Drop
Files".  Sorry, but I'm not sure of the original publication date.


>----------
>From: 	Wolfgang Loch[SMTP:Wolfgang.Loch@RZ.TU-Ilmenau.DE]
>Sent: 	Saturday, June 15, 1996 06:19 AM
>To: 	mfc-l@netcom.com
>Subject: 	Re: Drag and Drop
>
>VC++2.0, NT3.51
>
>>David McGaffin wrote:
>> 
>> Rather than trying to do the whole drop yourself, use OLE drag and drop.
>
>I think, having the same problem like Ken.
>The only thing we wanna do is to drag files (no OLE objects).
>Q105530 says: "The supported method for creating a drag and drop server
>is to use OLE version 2.0." and I'd like to use MFC (not the
>IDropSource
>interface)
>So I want to do something like this:
>
>void CFileListBox::OnLButtonDown(..)
>{
>	COLEDataSource src;
>	// ? put the selected filename to src
>	DROPEFFECT de = src.DoDragDrop();
>	switch( de )
>	{
>		:
>	}
>}
>
>The problem is: How can I insert filenames to a COLEDataSource object?
>Can anyone help ?
>thanks,
>	Wolfgang.
>



Logan Gilbert -- lgilbert@maxserv.com
Tuesday, November 19, 1996


Enviroment: VC++4.0, NT4.0, Win95

	Hello all.  I have a question about drag and drop.  I have currently =
been working on an OLE control which is used as a part of container =
application.  This container application uses the component gallery to =
insert the OLE control into the application and to create and invoke =
methods on the control via the component gallery's control wrap.  No =
problem.  All of this works fine. =20
	Now I would like to give my control drag and drop capabilty.  From what =
I have read in several books (Inside OLE, OLE Controls Inside-Out, =
etc...) dragging and dropping text, bitmaps or other forms of data is =
fairly straightforward.  One creates an OleDataSource object and =
provides the data they wish to drag in a specified format.  After doing =
this one calls DoDragDrop and if there is a Drop Target availiable then =
that's all there is to it.   What I would like to do is to be able to =
drag and drop the entire control.
	For example I could use this control within a container application and =
then drag the control to some other container such as MS Word, Visual =
Basic, or Excel.  I know that this is possible I just haven't been able =
to discover how to do it.  I know it is possible since I can Insert this =
control in the OLE Control Test Container provided with MSDEV and from =
there drag the control and drop it into MS Word, Excel, and the desktop =
(by left clicking and dragging on the thin black line surrounding the =
control).  The test container is doing the drag and drop work for me, =
but how?


Thank you for any help,

Logan Gilbert
lgilbert@maxserv.com 
Logan_Gilbert@msn.com 



John and Cecilia -- jandce@iglobal.net
Tuesday, January 07, 1997

Environment: MSVC 4.0/Win95

I have an application that uses a list view to display files on a network
drive.
I would like to be able to drag from the list a file or selection of files
to a folder or drive on my computer.

I have over-ridden the OnBegindrag() of my view as follows:

void View::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	DragFile* drag = new DragFile( CF_TEXT );   //have also tried registered
value
	DROPEFFECT drop = drag->DoDragDrop( DROPEFFECT_COPY|DROPEFFECT_MOVE );
	if( drop == DROPEFFECT_COPY )
		AfxMessageBox( "Drop copy" );
	if( drop == DROPEFFECT_MOVE )
		AfxMessageBox( "Drop move" );
	delete drag;
	*pResult = 0;
}

DragFile is a class derived from COleDataSource. The constructor calls
DelayRenderFileData for me. I have passed along CF_TEXT and the CF_*
returned from my RegisterFormat() call with the same results.

I have also over-ridden the OnRenderFileData() function, in the hopes that
I will be able to retreive the file from the remote location and save it to
the dropped location.

Problem: When I drag to a folder or drive on my computer, I get the circle
with a bar (no drop allowed) except for when I am over the trash container.
The HEIRSVR sample uses COleServerItem, but it requires that the document
be of a type COleDocument. My document is not and does not really need to
be.

Any ideas on what I could be missing or where else I should look would be
greatly appreciated.
-- 
John Boehme
jandce@iglobal.net
http://www.iglobal.net/pub/JohnAndCe/webmap.htm
http://www.iglobal.net/pub/JohnAndCe/ftpcontrol.htm




Mike Blaszczak -- mikeblas@nwlink.com
Wednesday, January 08, 1997

At 09:20 1/7/97 -0600, John Boehme wrote:
>Environment: MSVC 4.0/Win95

>I have an application that uses a list view to display files on a network
>drive. I would like to be able to drag from the list a file or
> selection of files to a folder or drive on my computer.

>I have over-ridden the OnBegindrag() of my view as follows:

Get the AfxMessageBox() calls out of there.  They're disrupting the
capture and tracking and state of the drag operation.  Focus
gets switched around and all hell busts loose.

.B ekiM
http://www.nwlink.com/~mikeblas/
Why does the "new" Corvette look like a 1993 RX-7?
These words are my own. I do not speak on behalf of Microsoft.




Tim Philip -- philip@cs.usask.ca
Thursday, January 09, 1997

ke Blaszczak writes:

At 09:20 1/7/97 -0600, John Boehme wrote:
>Environment: MSVC 4.0/Win95
> 
>I have an application that uses a list view to display files on a network
>drive. I would like to be able to drag from the list a file or
> selection of files to a folder or drive on my computer.
> 
>I have over-ridden the OnBegindrag() of my view as follows:

Change those AfxMessageBox()'s to TRACE0() calls.  The dialog boxes
are messing up the focus, etc.  TRACE calls won't.  You can still
follow what is going on then.

-------
Tim Philip, B.Sc. (Hon)                   philip@cs.usask.ca
Consultant, Graduate Student              http://www.cs.usask.ca/grads/philip

"... magic has a habit of lying low, like a rake in the grass." - T. Pratchet




| Вернуться в корень Архива |