win32使用拖放文件

于win32规划,使用拖放文件操作,非经常见(不否认有些人喜欢用button打开)


中使用拖拽,非常easy,仅仅须要在创建窗体的时候使用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

版权声明:本文博主原创文章。博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/blfshiye/p/4776167.html