ListCtrl接受拖动文件
【引言】
拖放操作在电脑中很常用,例如我们经常复制文件就可以按住ctrl键不放,然后再拖到另外一个窗口中,或者,可以把一个WORD文档直接拖动到WORD窗口即可打开,以前我使用过VB,里面直接有OleDragDrop事件,进行相应处理即可。那么如何在VC++中通过编程实现该功能呢,这就是本文要介绍的。
下面我来具体实现ListCtrl接受拖动文件的方法, 功能: “把磁盘目录下的文档或者文件夹拖动到ListCtrl中的时候,会把文件夹或者文档相对应的路径插入到ListCtrl中”
【实现】
具体做法如下:新建一个mfc对话框工程,取名为ListCtrlDrag; 用ClassWizard类向导新建一个类,取名为CMyListCtrl,基类为CListCtrl。

然后在类向导中切换到Message Maps选项卡,选择刚才建立的CMyListCtrl类,为WM_DROPFILES添加消息处理函数(实现拖放的关键也就在这里)

在OnDropFiles函数中实现ListCtrl对拖放操作的响应
void CMyListCtrl::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
char szFilePathName[_MAX_PATH+] = {}; //得到文件个数
UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, ); for (UINT nIndex= ; nIndex< nNumOfFiles; ++nIndex)
{
// 得到文件名
DragQueryFile(hDropInfo, nIndex, (LPTSTR)szFilePathName, _MAX_PATH); //获取ListCtrl已经存在的项数
int nCnt = this->GetItemCount(); //插入文本
LVITEM lvi = {};
lvi.mask = LVIF_TEXT ;
lvi.iItem = nCnt;
lvi.iSubItem = ;
lvi.pszText = szFilePathName;
this->InsertItem(&lvi);
} //完成拖放操作
DragFinish(hDropInfo); CListCtrl::OnDropFiles(hDropInfo);
}
在对话框中添加一个ListCtrl控件,然后勾选Accept files属性,如下图所示。

在CListCtrlDragDlg对话框类中给ListCtrl关联一个成员变量m_MyListCtrl, 类型就是派生自CListCtrl;
class CListCtrlDragDlg : public CDialog
{
// Construction
public:
CListCtrlDragDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data
//{{AFX_DATA(CListCtrlDragDlg)
enum { IDD = IDD_LISTCTRLDRAG_DIALOG };
CMyListCtrl m_MyListCtrl;
//}}AFX_DATA // ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListCtrlDragDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
在CListCtrlDragDlg对话框的初始化函数中初始化ListCtrl控件
BOOL CListCtrlDragDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here
m_MyListCtrl.InsertColumn( , "文件名称", LVCFMT_LEFT, );//插入列 return TRUE; // return TRUE unless you set the focus to a control
}
运行程序,把磁盘目录下的文档或者文件夹拖动到ListCtrl中的时候, 会把文件夹或者文档相对应的路径插入到ListCtrl中,如下图所示:

ListCtrl接受拖动文件的更多相关文章
- 『WPF』实现拖动文件到窗体(控件)
前言 实现从窗口外部拖文件到窗口内部并自动捕获文件地址. 第一步 开启属性 启用底层Window的AllowDrop属性,添加Drop事件. Drop事件:当你拖动文件到对应控件后,松开触发. 除Dr ...
- ASP.NET通过http/https的POST方式,发送和接受XML文件内容
本文转载:http://hi.baidu.com/ysyhyt/item/5011ae39ce3cf49fb80c0395 本文参考:http://blog.csdn.net/ououou123456 ...
- 禁止LISTCTRL表头拖动
禁止ListCtrl表头拖动(Prevent CListCtrl column resizing) /*The header control in the ListView control sends ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- Win10 导航窗口不能移动文件win10 资源管理器 无法拖动文件到左侧驱动器
Win10 导航窗口不能移动文件怎么办 Win10左侧导航栏不能移动文件怎么办 win10 资源管理器 无法拖动文件到左侧驱动器怎么办 在同一个文件夹可以拖动来移动文件,拖到地址栏的面包屑也可以移动文 ...
- html5拖动文件上传
使用html5的fileReader api <!DOCTYPE html><html lang="en"><head> <meta ch ...
- Java开发桌面程序学习(六)——拖动文件获得文件路径
拖动获得文件路径 在windows软件中,很多软件都提供了拖动文件的打开文件的功能,JavaFx中也是有这功能,是通过监听器来实现的 监听器 setOnDragDetected(new EventHa ...
- springMvc接受单个文件,多个文件,多组文件
web端 <form id="iconForm" enctype="multipart/form-data"></form> JS:通过 ...
- C#.WinForm 拖动文件到PictrueBox(支持跨UAC拖动)
如程序以普通方式打开,那么DragDrop DragEnter 事件是可以正常使用的.但以管理员身份运行时,这两个方法将失效. 原因是 Windows机制(用户界面特权隔离). UIPI:用户界面特权 ...
随机推荐
- Jetty和Tomcat的使用及性能测试
一 测试目的 这次对Jetty和Tomcat进行性能测试,主要是为了给新版本WebPortal的开发选择合适的Java Web Server. 我们之前对老的Rest和新的TMMI都进行过性能测试,R ...
- block的传值简单示例仅供参考,大牛勿喷
#import "ViewController.h" typedef void(^sumBlock)(int s);//声明为一个类型; /** * 用声明的block类型 su ...
- 基于spring-redis发布订阅模式的实现
redis配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...
- kylin一种OLAP的实现
1.基于hive.hadoop的预先计算. 2.cube存储在HBASE里面.利用HBase的列存储,实现MOLAP 3.在cube上做数据分析,kylin实现标准的SQL,实现查询HBase 所以说 ...
- OC基础(26)
集合对象的内存管理 Copy copy与内存管理 @property中的copy关键字 自定义的类实现copy操作 *:first-child { margin-top: 0 !important; ...
- ceph--磁盘和rbd、rados性能测试工具和方法
我在物理机上创建了5台虚拟机,搭建了一个ceph集群,结构如图: 具体的安装步骤参考文档:http://docs.ceph.org.cn/start/ http://www.centoscn.com/ ...
- 请添加 MIME 映射
HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 以管理员运行命令:C:\Wind ...
- django中添加用户
在django中添加用户,直接在auth_user表中添加会有问题,因为这里密码是加密的,可以通过manage.py shell加入 创建User: 1 >>> from djang ...
- c#中如何不通过后台直接用js筛选gridview中的数据条件筛选查询?
js: //条件筛选 var showstate = true; function imagechange() { if (showstate) { $('#_toggle').hide(500, f ...
- ASP.NET MVC 开源项目学习之ProDinner (二)
下面我们来看第二层:Data 这一层相对来说是对Core层的具体实现了. 从命名可以看出来,这和数据库相关. 1.Db.cs CodeFirst模式的本地数据库类,继承了DbContext. pr ...