接受文件拖拽窗口的实现

来源:互联网 发布:手机页面屏蔽广告js 编辑:程序博客网 时间:2024/06/05 18:34
    长期以来,我似乎都没有对知识进行总结,寄希望于博客吧。
    早上闲着没事,想起来一篇关于拖拽的文章,第一次见到还是借助于Google大侠,搜了n久才发现该文章,如今已经满地都是中文版本了。
    本人坚持自力更生的原则,自己做一遍吧,不想只抄袭人家的内容,然后保存一下就再也不看了。想把知识运用起来。
    废话少说,入正题。先做个简单的,实现窗口接受拖放到上面的文件,输出其全路径。
    用到了如下三个函数:
    VOID DragAcceptFiles( HWND hWnd,  BOOL fAccept);
    UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile,UINT cch);
    VOID DragFinish(HDROP hDrop);
    函数更详细的解释参看MSDN。需要处理WM_DROPFILES消息。
    剩下的就简单了。
    第一步,当需要开始接受文件拖拽时,调用DragAcceptFiles。(一般是在窗口的初始化函数中。)
    第二步,在WM_DROPFILES消息中调用DragQueryFile函数获取文件列表,并在结束处理后调用DragFinish释放系统分配的内存就可以了。
    LRESULT OnInitDialog(...)
    {
        ...
        DragAcceptFiles(...);
        ...
        return TRUE;
    }
     LRESULT on_drop_files_msg(...)
    {
        HDROP hdrop = (HDROP)wParam;
        UINT ufc = DragQueryFile(hdrop,0xffffffff,0,0);
        char buf[MAX_PATH];
        for(UINT i=0; i<fc; ++i)
        {
            DragQueryFile(hdrop,i,buf,MAX_PATH);
            ...
        }
        DragFinish(hdrop);
        return 0;
    }
    代码大概如此,已经能接收到拖拽到窗口上的文件了,DragQueryFile得出的是文件的全路径,之所以要循环调用,
是因为拖放操作可能同时拖了n个文件。
    另有一函数DragQueryPoint类似于DragQueryFile,不过它的出的是松开鼠标时鼠标的坐标。并不难用。
    好了,先到这。