【引言】

拖放操作在电脑中很常用,例如我们经常复制文件就可以按住ctrl键不放,然后再拖到另外一个窗口中,或者,可以把一个WORD文档直接拖动到WORD窗口即可打开,以前我使用过VB,里面直接有OleDragDrop事件,进行相应处理即可。那么如何在VC++中通过编程实现该功能呢,这就是本文要介绍的。

下面我来具体实现ListCtrl接受拖动文件的方法, 功能: “把磁盘目录下的文档或者文件夹拖动到ListCtrl中的时候,会把文件夹或者文档相对应的路径插入到ListCtrl中”

【实现】

具体做法如下:新建一个mfc对话框工程,取名为ListCtrlDrag; 用ClassWizard类向导新建一个类,取名为CMyListCtrl,基类为CListCtrl。

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

在OnDropFiles函数中实现ListCtrl对拖放操作的响应

  1. void CMyListCtrl::OnDropFiles(HDROP hDropInfo)
  2. {
  3. // TODO: Add your message handler code here and/or call default
  4. char szFilePathName[_MAX_PATH+] = {};
  5.  
  6. //得到文件个数
  7. UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, );
  8.  
  9. for (UINT nIndex= ; nIndex< nNumOfFiles; ++nIndex)
  10. {
  11. // 得到文件名
  12. DragQueryFile(hDropInfo, nIndex, (LPTSTR)szFilePathName, _MAX_PATH);
  13.  
  14. //获取ListCtrl已经存在的项数
  15. int nCnt = this->GetItemCount();
  16.  
  17. //插入文本
  18. LVITEM lvi = {};
  19. lvi.mask = LVIF_TEXT ;
  20. lvi.iItem = nCnt;
  21. lvi.iSubItem = ;
  22. lvi.pszText = szFilePathName;
  23. this->InsertItem(&lvi);
  24. }
  25.  
  26. //完成拖放操作
  27. DragFinish(hDropInfo);
  28.  
  29. CListCtrl::OnDropFiles(hDropInfo);
  30. }

在对话框中添加一个ListCtrl控件,然后勾选Accept files属性,如下图所示。

在CListCtrlDragDlg对话框类中给ListCtrl关联一个成员变量m_MyListCtrl, 类型就是派生自CListCtrl;

  1. class CListCtrlDragDlg : public CDialog
  2. {
  3. // Construction
  4. public:
  5. CListCtrlDragDlg(CWnd* pParent = NULL); // standard constructor
  6.  
  7. // Dialog Data
  8. //{{AFX_DATA(CListCtrlDragDlg)
  9. enum { IDD = IDD_LISTCTRLDRAG_DIALOG };
  10. CMyListCtrl m_MyListCtrl;
  11. //}}AFX_DATA
  12.  
  13. // ClassWizard generated virtual function overrides
  14. //{{AFX_VIRTUAL(CListCtrlDragDlg)
  15. protected:
  16. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  17. //}}AFX_VIRTUAL

在CListCtrlDragDlg对话框的初始化函数中初始化ListCtrl控件

  1. BOOL CListCtrlDragDlg::OnInitDialog()
  2. {
  3. CDialog::OnInitDialog();
  4.  
  5. // Add "About..." menu item to system menu.
  6.  
  7. // IDM_ABOUTBOX must be in the system command range.
  8. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  9. ASSERT(IDM_ABOUTBOX < 0xF000);
  10.  
  11. CMenu* pSysMenu = GetSystemMenu(FALSE);
  12. if (pSysMenu != NULL)
  13. {
  14. CString strAboutMenu;
  15. strAboutMenu.LoadString(IDS_ABOUTBOX);
  16. if (!strAboutMenu.IsEmpty())
  17. {
  18. pSysMenu->AppendMenu(MF_SEPARATOR);
  19. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  20. }
  21. }
  22.  
  23. // Set the icon for this dialog. The framework does this automatically
  24. // when the application's main window is not a dialog
  25. SetIcon(m_hIcon, TRUE); // Set big icon
  26. SetIcon(m_hIcon, FALSE); // Set small icon
  27.  
  28. // TODO: Add extra initialization here
  29. m_MyListCtrl.InsertColumn( , "文件名称", LVCFMT_LEFT, );//插入列
  30.  
  31. return TRUE; // return TRUE unless you set the focus to a control
  32. }

运行程序,把磁盘目录下的文档或者文件夹拖动到ListCtrl中的时候, 会把文件夹或者文档相对应的路径插入到ListCtrl中,如下图所示:

ListCtrl接受拖动文件的更多相关文章

  1. 『WPF』实现拖动文件到窗体(控件)

    前言 实现从窗口外部拖文件到窗口内部并自动捕获文件地址. 第一步 开启属性 启用底层Window的AllowDrop属性,添加Drop事件. Drop事件:当你拖动文件到对应控件后,松开触发. 除Dr ...

  2. ASP.NET通过http/https的POST方式,发送和接受XML文件内容

    本文转载:http://hi.baidu.com/ysyhyt/item/5011ae39ce3cf49fb80c0395 本文参考:http://blog.csdn.net/ououou123456 ...

  3. 禁止LISTCTRL表头拖动

    禁止ListCtrl表头拖动(Prevent CListCtrl column resizing) /*The header control in the ListView control sends ...

  4. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

  5. Win10 导航窗口不能移动文件win10 资源管理器 无法拖动文件到左侧驱动器

    Win10 导航窗口不能移动文件怎么办 Win10左侧导航栏不能移动文件怎么办 win10 资源管理器 无法拖动文件到左侧驱动器怎么办 在同一个文件夹可以拖动来移动文件,拖到地址栏的面包屑也可以移动文 ...

  6. html5拖动文件上传

    使用html5的fileReader api <!DOCTYPE html><html lang="en"><head> <meta ch ...

  7. Java开发桌面程序学习(六)——拖动文件获得文件路径

    拖动获得文件路径 在windows软件中,很多软件都提供了拖动文件的打开文件的功能,JavaFx中也是有这功能,是通过监听器来实现的 监听器 setOnDragDetected(new EventHa ...

  8. springMvc接受单个文件,多个文件,多组文件

    web端 <form id="iconForm" enctype="multipart/form-data"></form> JS:通过 ...

  9. C#.WinForm 拖动文件到PictrueBox(支持跨UAC拖动)

    如程序以普通方式打开,那么DragDrop DragEnter 事件是可以正常使用的.但以管理员身份运行时,这两个方法将失效. 原因是 Windows机制(用户界面特权隔离). UIPI:用户界面特权 ...

随机推荐

  1. UIView之userInteractionEnabled属性介绍

    来源:http://my.oschina.net/hmj/blog/108002 属性作用 该属性值为布尔类型,如属性本身的名称所释,该属性决定UIView是否接受并响应用户的交互. 当值设置为NO后 ...

  2. HtmlparseUtil.java

    该类并不是一个通用的工具类,需要按自己的要求实现,这里只记录了Htmlparse.jar包的一些用法.仅此而已! 详细看这里:http://gundumw100.iteye.com/blog/7043 ...

  3. Web Service 性能测试工具比较

    背景 希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力(请求数/秒).以微信服务器为例,每个用户用独立的登录token,做各种操作, ...

  4. .NET单元测试

    原文链接:http://www.cnblogs.com/edisonchou/p/5467573.html

  5. C++学习23 虚函数详解

    虚函数对于多态具有决定性的作用,有虚函数才能构成多态.上节的例子中,你可能还未发现虚函数的用途,不妨来看下面的代码. #include <iostream> using namespace ...

  6. [Flex] ButtonBar系列——labelFunction用户提供的函数,在每个项目上运行以确定其标签

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  7. [SQJ]sql如何实现类似统计的功能

    假设mssql2000中, 有如下表: table Class class_No course_Name ----------------------------------- chinese mat ...

  8. sql游标的使用

    转载:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集 ...

  9. 【转】java内部类的作用

    http://andy136566.iteye.com/blog/1061951/ 推荐一. 定义 放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不 ...

  10. HDU1272

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1272 对于这道题,只要找出形成的图是不是连通无环的图即可.即是判断输入的两个点是否来自同一个父亲结点 ...