win32使用文件拖拽

在win32程序中,使用文件进行拖拽的操作,是很常见的(不否定有的人喜欢用按钮来打开)

其实在程序中使用拖拽,很简单,只需要在创建窗口的时候使用WS_EX_ACCEPTFILES标识符,然后使用一个消息函数去处理(当然,这是属于窗口的扩展风格,所以需要使用CreateWindowEx来创建):

hWnd = CreateWindowEx(WS_EX_ACCEPTFILES, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
						 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

这样我们就可以响应对应的消息类型:

case WM_DROPFILES:
		OnDropFiles(hWnd, (HDROP)wParam);
		break;

响应函数,其实挺简单的:

VOID OnDropFiles(HWND hwnd, HDROP hDropInfo)
{
	UINT  nFileCount = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);
	TCHAR szFileName[_MAX_PATH] = _T("");
	DWORD dwAttribute;

	// 获取拖拽进来文件和文件夹
	for (UINT i = 0; i < nFileCount; i++)
	{
		::DragQueryFile(hDropInfo, i, szFileName, sizeof(szFileName));
		dwAttribute = ::GetFileAttributes(szFileName);

		// 是否为文件夹
		if (dwAttribute & FILE_ATTRIBUTE_DIRECTORY)
		{
			::SetCurrentDirectory(szFileName);
			EnumerateFiles();
		}
		else
		{
			// 文件可以直接进行播放
			cout << szFileName << endl;
			MessageBox(0, szFileName, "", MB_OK);
		}
	}

	::DragFinish(hDropInfo);
}

EnumerateFiles()是枚举文件夹中子文件的函数:

VOID EnumerateFiles()
{
	WIN32_FIND_DATA fd;
	HANDLE hFind = ::FindFirstFile(_T("*.*"), &fd);

	if (hFind != INVALID_HANDLE_VALUE)
	{
		do
		{
			// 如果为目录
			if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				if (_tcscmp(fd.cFileName, _T(".")) && _tcscmp(fd.cFileName, _T("..")))
				{
					::SetCurrentDirectory(fd.cFileName);
					EnumerateFiles();
					::SetCurrentDirectory(_T(".."));
				}
			}
			// 如果为文件
			else
			{
				string strDir;
				TCHAR      lpDir[MAX_PATH];

				::GetCurrentDirectory(MAX_PATH, lpDir);
				strDir = lpDir;
// 				if ( strDir.Right(1) != _T("\\") )
// 				{
// 					strDir += _T("\\");
// 				}
				strDir += fd.cFileName;
				MessageBox(0, strDir.c_str(), "", MB_OK);
			}
		} while (::FindNextFile(hFind, &fd));

		::FindClose(hFind);
	}
}

就这么简单,就能实现所要的效果了

对应的使用例子下载传送门:

http://download.csdn.net/detail/zengraoli/7864689

时间: 2024-10-10 02:51:07

win32使用文件拖拽的相关文章

文件拖拽上传

1 <style> 2 div{ 3 width: 300px; 4 height: 300px; 5 border:1px dashed #000; 6 position:absolute; 7 top: 50%; 8 left: 50%; 9 margin:-150px 0 0 -150px; 10 text-align:center; 11 font:20px/300px '微软雅黑'; 12 display:none; 13 } 14 </style> 15 <scr

文件拖拽功能失效,原来是UAC把它过滤了

碰到这样一个问题,文件拖拽功能在没有以管理员身份运行的时候是正常的,但是一旦使用管理员身份运行,这个功能就失效了,搜索了好久总算找到原因了. 在window visa以上版本里引入了用户账户控制(UAC),在管理员权限上会过滤掉一些窗口消息,文件拖拽正好也也被过滤了,解决的方法就是使用ChangeWindowMessageFilterEx()解除过滤 //解除window7以上窗口对该消息的过滤 ChangeWindowMessageFilterEx(hwndDlg, WM_DROPFILES,

wxpython实现文件拖拽

我想让wx.grid里面的单元格能够支持文件拖拽,实现起来挺简单的,共分3步: 1.创建一个wx.FileDropTarget子类的对象,并把要支持拖拽的控件传给它的构造函数,此处是grid 2.调用grid的SetDropTarget函数,并将第1步创建的wx.FileDropTarget子类对象传给它 3.实现第1步创建的wx.FileDropTarget的子类,并覆盖OnDropFiles函数 贴出代码如下: import wx import wx.grid import logging

VC++ 文件拖拽功能实现

使用过QQ的人都知道,只要把文件拖拽到消息框中就可以传送文件了.那么这种功能是如何实现的呢?其实很简单,只需要响应一个WM_DROPFILES消息就可以了. 在基于对话框的程序中,默认是没有这个消息的,按下Ctrl+W,弹出类向导对话框,选择Class Info标签,在Message fileter下拉列表中选择Window,然后再点击Message Maps标签,就出现WM_DROPFILES消息了,添加该消息的响应函数: void CTestDlg::OnDropFiles(HDROP hD

CEdit添加右键菜单, ClistCtrl接收文件拖拽

CEdit接收文件拖拽很容易,但ClistCtrl却很难: CListCtrl添加右键菜单很容易,而CEdit却很难. 这种功能不全面,阴差阳错的感觉让人很头疼. 下面介绍一下 CEdit添加右键菜单 和 CListCtrl接收文件拖拽的方法 1. CEdit 添加右键菜单 从CEdit派生出一个类CMyEdit,添加消息ON_WM_CONTEXTMENU(),响应消息函数OnContextMenu().如下: 类定义: //自定义CMyEdit //目的为了实现CEdit添加右键菜单 clas

Linux下安装VMware Tools(使虚拟机支持文件拖拽)

如图点击虚拟机找到安装VMware Tools选项,点击后会在虚拟机桌面显示一个光盘,双击进入如下页面: 选择压缩包将其复制放入Home中不带中文的文件夹: 打开终端,输入cd命令进入文件夹,将压缩包解压: tar -xzf VMwareTools-xx.x.xx-xxxxxxx.tar.gz //xx为自己的Tools版本号 解压后按照以下输入命令行进入安装过程: 遇到选项输入空格即默认选项即可 一直到显示下图则安装完成,此时重启即可实现虚拟机与本机间文件拖拽: 原文地址:https://ww

Win32 文件拖拽

1.响应系统消息  WM_DROPFILES 2.在响应函数里面获取拖拽文件路径 1 LRESULT OnDropFiles(UINT uMsg, WPARAM wParam, LPARAM lParam) 2 { 3 HDROP hDropInfo = (HDROP)wParam; 4 5 TCHAR filePath[80*MAX_PATH] = {0}; 6 7 int nFileCount; 8 9 nFileCount = ::DragQueryFile(hDropInfo , 0xF

HTML5拖拽——将本地文件拖拽到网页中显示

HTML5标准中的提供的用于文件输入输出(I/O)的对象 File: 代表一个文件对象 FileList: 代表一个文件列表,类数组对象 FileReader 用于从文件中提取内容 FileWrite 用于向文件中写入类容 这些对象需要在 H5的拖拽事件中通过 e.dataTransfer 来访问和获取 完成效果如下: Data URL给了我们一种很巧妙的将图片"嵌入"到HTML中的方法.跟传统的用img标记将服务器上的图片引用到页面中的方式不一样,在Data URL协议中,图片被转换

SpringMvc+jQuery 文件拖拽上传、选择上传

最近做了个简易的文件上传功能,jsp版本的,后续会完善更多的功能,不过现在已经能用了,需要的小伙伴,直接引用下面的文件内容直接copy到自己的项目中就ok了,效果如图: fileupload.css: .fileupload_box { position:relative; width: 100%; height: 100%; border: 3px dashed #E5E5E5; text-align: center; z-index: 2000; cursor: pointer; margi