如何拖放文件完成?

如在Winamp或VLC播放器,如何做一个文件拖放? 我的意思是我想知道什么样的编码进入应用程序? 我想知道的C + +

在Windows上的纯C / C ++中,开始阅读关于DragAcceptFiles函数和WM_DROPFILES消息。 如果您使用更强大的C ++库(Qt,Wx等),请检查各自的文档。 这将有助于知道你使用什么,更具体的。

另外, 这个讨论可能会回答你的问题。 如果这是你的意思,请关闭这个问题。

编辑 后,我发布了这个问题被编辑为C ++的资格; 我要留下这个答案,仅供参考。


“什么样的编码进入应用程序”:

这很大程度上取决于平台和语言。 例如,下面是通过C#/ .NET或VB / .NET的 Windows示例。 对于C ++,Delphi等 – 这些技巧将会有所不同。

用com:

创建一个公共扩展IDropTarget的类

注册你的班级滴。 在WM_CREATE中执行此操作

RegisterDragDrop(hwnd,static_cast<IDropTarget*>(pointer_to_your_class)); 

在你的课堂上,你需要重写一些函数,因为它们是纯虚拟的:

 virtual HRESULT STDMETHODCALLTYPE DragEnter( /* [unique][in] */ __RPC__in_opt IDataObject *pDataObj, /* [in] */ DWORD grfKeyState, /* [in] */ POINTL pt, /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0; virtual HRESULT STDMETHODCALLTYPE DragOver( /* [in] */ DWORD grfKeyState, /* [in] */ POINTL pt, /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0; virtual HRESULT STDMETHODCALLTYPE DragLeave( void) = 0; virtual HRESULT STDMETHODCALLTYPE Drop( /* [unique][in] */ __RPC__in_opt IDataObject *pDataObj, /* [in] */ DWORD grfKeyState, /* [in] */ POINTL pt, /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0; 

当这些事件发生时,这些函数中的每一个函数都会被调用,也就是说,当某个人用你的类中的DragEnter文件在窗口中传递鼠标时,这些函数将被调用。

您还需要实现IDropTarget扩展的更多功能,在您的MSDN中检查IUnknown。

然后你需要查询IDataObject参数来获取数据:

 FORMATETC fdrop = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; if (SUCCEEDED(pDataObj->QueryGetData(&fdrop)) ){ STGMEDIUM stgMedium = {0}; stgMedium.tymed = TYMED_HGLOBAL; HRESULT hr = pDataObj->GetData(&fdrop, &stgMedium); if (SUCCEEDED(hr)) { HGLOBAL gmem = stgMedium.hGlobal; HDROP hdrop = (HDROP)GlobalLock(gmem); UINT numOfFiles = DragQueryFile( (HDROP) hdrop, 0xFFFFFFFF, NULL, 0 ); TCHAR buffer[MAX_PATH]; for( int i=0;i<numOfFiles;i++ ){ UINT charsCopied = DragQueryFile( (HDROP) hdrop, i, buffer, MAX_PATH ); MessageBox(NULL,buffer,_T("Archivos a copiar: "),MB_OK); } // use str GlobalUnlock(gmem); /*TCHAR* str = (TCHAR*)GlobalLock(gmem); // use str GlobalUnlock(gmem);*/ ::ReleaseStgMedium(&stgMedium); } } 

干杯!

你应该使用COM的Ole拖放界面。

在OLE / COM / ActiveX的日子之前,我们会做如下的事情:

  • 如果我们收到一个鼠标按下事件,请注意光标位置。
  • 如果我们收到一个鼠标移动,并从原点移动了一定的距离,我们开始一个拖动操作。 构建一个表示要拖动的对象的光标(从原始光标位置确定)。
  • 当我们收到一个鼠标:如果拖动从未开始,那么这是一个单击,否则使用放置位置来确定如何处理对象。

注意:这些都不允许你在应用程序之间拖动对象,而只是在单独的应用程序中。

对于几乎所有的问题,比如“我如何做这个UI的事情?”

我的答案总是:“使用wxWidgets” 。

雨果