繁体   English   中英

如何拖放文件?

[英]How drag and drop of files is done?

如在winamp或vlc播放器中,如何拖放文件? 我的意思是我想知道什么样的编码进入应用程序? 我想知道c ++

在Windows上的纯C / C ++中,开始阅读DragAcceptFiles函数和WM_DROPFILES消息。 如果您正在使用功能更强大的C ++库(Qt,Wx等),请查看各自的文档。 更具体地说,有助于了解您的用途。

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

用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);
    }

}

干杯!

我发布之后 编辑,编辑的问题符合C ++标准; 我将在这里留下这个答案仅供参考。


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

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

您应该使用COM的Ole拖放接口。

在OLE / COM / ActiveX之前,我们会做类似以下的事情:

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

注意:这些都不允许您在应用之间拖动对象,只是在单个应用内部。

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

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

雨果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM