VC++ 文件拖拽功能实现

使用过QQ的人都知道,只要把文件拖拽到消息框中就可以传送文件了。那么这种功能是如何实现的呢?其实很简单,只需要响应一个WM_DROPFILES消息就可以了。

  在基于对话框的程序中,默认是没有这个消息的,按下Ctrl+W,弹出类向导对话框,选择Class Info标签,在Message fileter下拉列表中选择Window,然后再点击Message Maps标签,就出现WM_DROPFILES消息了,添加该消息的响应函数:

  void CTestDlg::OnDropFiles(HDROP hDropInfo)

  {

  // TODO: Add your message handler code here and/or call default

  //.........................

   CDialog::OnDropFiles(hDropInfo);

  }

  另外,要让对话框能够接受文件拖拽,还需要设置对话框属性。在对话框上点击右键,选择Properties->Extended Styles,点选Accept files选项即可。

  要获得当前拖拽的文件的完整文件名(含路径),只需要一个函数:

  UINT DragQueryFile(

  HDROP hDrop,

  UINT iFile,

  LPTSTR lpszFile,

  UINT cch

  );

  参数解释:

  hDrop: HDROP标识符,即响应函数中的hDropInfo参数

  iFile: 待查询的文件索引号,从0开始。可以同时拖拽多个文件,因此就需要一个索引号来进行区分。如果该参数为0xFFFFFFFF,则该函数返回拖拽的文件的个数

  lpszFile: 用于存放文件名的缓冲区首地址

  cch: 缓冲区长度

  返回值:文件名长度

  另外,查询完成后需要释放系统分配内存,使用下面这个函数:

  VOID DragFinish(

  HDROP hDrop

  );

  下面是一个完整的代码示例,将文件拖拽到对话框上后会弹出消息框显示完整文件名:

  

void CTestDlg::OnDropFiles(HDROP hDropInfo)

  {

    // TODO: Add your message handler code here and/or call default

    UINT count = 0;

    char filePath[MAX_PATH] = {0};

    count = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);

    if(count)

    {

      for(UINT i=0; i<count; i++)

      {

        int pathLen = DragQueryFile(hDropInfo, i, filePath, sizeof(filePath));

        AfxMessageBox(filePath);

      }

   }

  DragFinish(hDropInfo);

  CDialog::OnDropFiles(hDropInfo);

  }

  同理,如果只有把文件拖拽到特定的控件中时才有响应,只需要把该控件的Accept files样式勾选上即可。

时间: 2024-10-14 11:14:05

VC++ 文件拖拽功能实现的相关文章

文件拖拽功能失效,原来是UAC把它过滤了

碰到这样一个问题,文件拖拽功能在没有以管理员身份运行的时候是正常的,但是一旦使用管理员身份运行,这个功能就失效了,搜索了好久总算找到原因了. 在window visa以上版本里引入了用户账户控制(UAC),在管理员权限上会过滤掉一些窗口消息,文件拖拽正好也也被过滤了,解决的方法就是使用ChangeWindowMessageFilterEx()解除过滤 //解除window7以上窗口对该消息的过滤 ChangeWindowMessageFilterEx(hwndDlg, WM_DROPFILES,

C#窗体实现文件拖拽功能

1.首先要把你的窗体或者空间的AllowDrag属性设置为允许 2.注册DragEnter事件 3.获得文件路径,先通过e.Data.GetFormats()方法获得所有数据格式 4.调用e.GetData()方法根据指定的数据格式获得文件路径 5.有了文件路径,相信一切问题迎刃而解 下面是例子: private void textBox1_DragEnter(object sender, DragEventArgs e) { //获得数据格式 File.WriteAllLines("C:\\1

Atitit。D&amp;D drag&amp;drop拖拽功能c#.net java swing的对比与实现总结

Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制.必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的) 2 3. ---java黑头的拖曳..必须有DragEnter事件(单独写 Drop事件是不会具有拖拽功能的) 2 4. 代码 3 5. 参考 5 1. 实现一个D&D操作一般包括三个步骤: 首先实现一个拖拽源,这个拖拽

CEdit添加右键菜单, ClistCtrl接收文件拖拽

CEdit接收文件拖拽很容易,但ClistCtrl却很难: CListCtrl添加右键菜单很容易,而CEdit却很难. 这种功能不全面,阴差阳错的感觉让人很头疼. 下面介绍一下 CEdit添加右键菜单 和 CListCtrl接收文件拖拽的方法 1. CEdit 添加右键菜单 从CEdit派生出一个类CMyEdit,添加消息ON_WM_CONTEXTMENU(),响应消息函数OnContextMenu().如下: 类定义: //自定义CMyEdit //目的为了实现CEdit添加右键菜单 clas

JAVA UI 拖拽功能

java GUI拖拽功能是很实用也相对高级一些的功能. 有一小部分的GUI控件支持他们有dragEnabled属性.这些JComponent包括:javax.swing.JColorChooserjavax.swing.JFileChooserjavax.swing.JListjavax.swing.JTablejavax.swing.JTreejavax.swing.text.JTextComponent 大部分的控件不支持没有这个属性,尤其是常用的jpanel和jframe. 一种简单的方法

bcb ole拖拽功能的实现

最近项目中用到了OLE 拖拽功能 和BCB 一个Form的Drag 不同的是,只有实现了OLE 拖拽才能,从其他程序拖拽数据到Form 下面的代码实现了,同HTML网页拖拽到Form时,Form获得HTML数据 其核心思想是, 1,要实现 COM的 IDropTarget 接口 2,RegisterDragDrop(handle,this); 注册窗口的拖拽 3,窗口类构造 OleInitialize(NULL); 4,窗口类析构时 OleUninitialize(); 5,在下面的代码中,我将

文件拖拽上传

1 <style> 2 div{ 3 width: 300px; 4 height: 300px; 5 border:1px dashed #000; 6 position:absolute; 7 top: 50%; 8 left: 50%; 9 margin:-150px 0 0 -150px; 10 text-align:center; 11 font:20px/300px '微软雅黑'; 12 display:none; 13 } 14 </style> 15 <scr

js实现登陆页面的拖拽功能

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>登陆页面的拖拽功能实现</title> </head> <style type="text/css"> *{ margin:0; padding:0; } a{ text-decoration: none; } .dialog{ width: 380px;

使用UGUI实现拖拽功能(拼图小游戏)

实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragHandler 1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.EventSystems; 4 5 public class DragOnPic : MonoBehaviour,IBeginDragHandler