zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Linux下防火墙的相关命令
    java中的异常总结
    Java中的==和equals的区别
    一个简单的前后端分离项目,适合新手练手
    入住博客园鸭
    centos7 安装 Python PIL模块
    Linux 装机错误解决
    Python 爬取煎蛋网妹子图片代码
    Python 简易聊天机器人
    Python员工信息表练习
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4776167.html
Copyright © 2011-2022 走看看