- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
拖拽是一个不错的功能,只是好像大家都不怎么用这个功能,顶多是拷贝文件的时候,在资源管理器里面拖动文件。
然而如果自己的程序也支持拖拽那就更方便了,打开文件的时候不必在“公用文件对话框”找半天,直接从资源管理器拖进来就OK了。
这是怎么实现的呢?首先我们需要调用DragAcceptFiles使自己的程序接受拖拽文件。
DragAcceptFiles(hWnd,TRUE);
之后窗口(或者控件)就可以被拖入文件了。拖入文件的消息是WM_DROPFILES,参数是(HDROP)wParam。
我们这里需要知道三个函数:DragQueryPoint,DragQueryFile,DragFinish。
调用DragQueryPoint可以取得拖入的时候鼠标的位置。DragQueryFile用于取得拖入的文件的数量、文件路径等信息。处理完以后,要调用DragFinish将HDROP释放掉。
DragQueryPoint原型:- BOOL DragQueryPoint(
- HDROP hDrop,
- LPPOINT lppt
- );
复制代码 可以看出DragQueryPoint的用法十分简单,定义一个POINT,然后传入指针,就能从POINT结构体取得拖入的鼠标位置。- POINT pt;
- DragQueryPoint((HDROP)wParam,&pt);
复制代码 让后就是稍微复杂的DragQueryFile。它的原型:- UINT DragQueryFile(
- HDROP hDrop,
- UINT iFile,
- LPTSTR lpszFile,
- UINT cch
- );
复制代码 其实也不复杂。它有三个功能:
1、取得拖入的文件的数量。
2、取得拖入的文件的文件路径的长度。
3、取得拖入的文件的文件路径。
如果要取得拖入的文件的数量,只需要调用DragQueryFile((HDROP)wParam,0xFFFFFFFF,NULL,0);,它就会返回拖入的文件的数量。
文件的索引是从0开始的,它的第二个参数不为零的时候是取得文件路径。你可以事先分配好固定长度的缓冲区,也可以实时分配能装下任意长度文件路径的缓冲区。
你可以这么用:- TCHAR szFileName[0x100];//假定文件路径长度不超过256字节
- DragQueryFile((HDROP)wParam,文件索引,szFileName,sizeof(szFileName));
复制代码 也可以- TCHAR*pszFileName;
- size_t cbFileName;
- cbFileName=DragQueryFile((HDROP)wParam,文件索引,NULL,0);//取得文件路径长度
- pszFileName=(TCHAR*)malloc(cbFileName);//分配内存
- DragQueryFile((HDROP)wParam,文件索引,pszFileName,cbFileName);
复制代码 其实后者更占内存。 |
|