找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2596|回复: 0

【Win界面】让自己的窗口可以被拖入文件

[复制链接]

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24265 个
贡献
46222 次
宅之契约
0 份
在线时间
2299 小时
注册时间
2014-1-26
发表于 2015-1-18 00:01:09 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

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

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-4 17:24 , Processed in 0.043744 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表