在win32程序中,使用文件进行拖拽的操作,是很常见的(不否定有的人喜欢用按钮来打开),其实在程序中使用拖拽,很简单,只需要在创建窗口的时候使用WS_EX_ACCEPTFILES标识符,然后使用一个消息函数去处理(当然,这是属于窗口的扩展风格,所以需要使用CreateWindowEx来创建):
hWnd = CreateWindowEx(WS_EX_ACCEPTFILES, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
这样我们就可以响应对应的消息类型:
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
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);
}
}
就这么简单,就能实现所要的效果了.
相关阅读
----VC实现图片拖拽及动画