Thursday, February 5, 2009

可拖拽文件窗口的使用.WS_EX_ACCEPTFILES和DragQueryFile

如果窗口拥有扩展属性WS_EX_ACCEPTFILES
其就可以使其可以接受拖拽效果
当拖拽成功时,被拖拽的窗口接受到WM_DROPFILES消息.
这时候,应该手动调用DragQueryFile函数看看被拖拽的是谁~ 然后处理.
UINT DragQueryFile(
HDROP hDrop,
UINT iFile,
LPTSTR lpszFile,
UINT cch
);

这个很简单,固然很简单,每个看MSDN的人都能找得到.
不过这个函数却有着Windows函数的某类函数的特点:不同参数值,不同行为表示.

这个函数的第二个参数iFile,如果iFile=0xFFFFFFFF,它则表示要查询拖拽了几个文件.(返回值)
如果iFile是其他值,则表示我要查询被拖拽第iFile个文件,其返回值是被复制的字节长度.

类似的还有GetEnvironmentVariable这样的函数,使用的时候很灵活.

另外cch是被复制的最大长度.
前段时间刚发现一个东西MAX_PATH, 它为260;

过去做程序老是有一个问题...这个文件名会不会很长....这个URL会不会很长....,曾经有一段时间我做程序都自定义一个MAX_FILE_LENGTH,然后在程序说明上说:支持文件地址长度小于XXX...

原来在Windows的最大文件长度是255!!!URL也是一样.... 做过实验,在Windows文件名太长系统会自动使用缩略文件名的功能.

不多说,给出使用范例.

case WM_DROPFILES:
//...
TCHAR Buffer[MAX_PATH];
unsigned int i;
unsigned int NumberOfDrags;
NumberOfDrags = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, Buffer , MAX_PATH);
for (i = 0, NumberOfDrags , i++) {
DragQueryFile((HDROP)wParam, i, Buffer , MAX_PATH);
//actions here
}

No comments:

Post a Comment