转载地址:http://blog.csdn.net/starlee/article/details/1472710

现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,Windows自带的播放软件Windows Media Player,你可以拖着一个媒体文件放到它的主窗口中,它就会开始播放这个文件。
    怎么让自己的软件也有这个功能呢?
    其实,并不是很难,只要让你需要有拖拽功能的控件响应WM_DROPFILES消息就行了。下面以Edit控件和ListBox控件为例子来说明。
    首先,从CEdit继承,自定义一个Edit控件。在头文件添加如下的消息响应函数:

afx_msg void OnDropFiles(HDROP hDropInfo);

然后,在cpp文件中的消息映射中添加:

ON_WM_DROPFILES()

最后,在cpp文件中添加OnDropFiles函数的实现,对拖拽的文件进行处理。下面是完整的代码:

// lxEdit.h

class CDropEdit: public CEdit
{
    DECLARE_DYNAMIC(ClxEdit)

public:
    ClxEdit();
    virtual ~ClxEdit();

afx_msg void OnDropFiles(HDROP hDropInfo); //第一步

protected:
    DECLARE_MESSAGE_MAP()
};

// lxEdit.cpp

#include "stdafx.h"
#include "DropEdit.h"

IMPLEMENT_DYNAMIC(ClxEdit, CEdit)
CDropEdit::CDropEdit()
{ }

CDropEdit::~CDropEdit()
{ }

BEGIN_MESSAGE_MAP(CDropEdit, CEdit)
    ON_WM_DROPFILES()  //第二步
END_MESSAGE_MAP()

void CDropEdit::OnDropFiles(HDROP hDropInfo)  //第三步
{
    // 被拖拽的文件的文件名
    char szFileName[MAX_PATH + 1];
    // 得到被拖拽的文件名
    DragQueryFile(hDropInfo, 0, szFileName, MAX_PATH);
    // 把文件名显示出来
    SetWindowText(szFileName);
    DragFinish(hDropInfo);
    CEdit::OnDropFiles(hDropInfo);
}

最后,在资源视图中编辑框控件上:右键单击---添加变量---变量类型为CDropEdit---······

这样,便将我们新建的Edit类CDropEdit与主窗口关联起来了。

可以看到,在上面的代码中,得到拖拽文件名的是函数DragQueryFile。这是Windows提供的一个API函数,用来得到一次成功的拖拽操作中的文件名。下面是该函数的原型:

// 参数说明:
// hDrop 句柄,由消息传入。
// iFile 文件索引。
//         如果该参数值为0xFFFFFFFF,函数返回拖拽操作中的文件数量。
//         如果该参数值为0到拖拽文件数量之间的数值,函数将对应索引的文件名拷贝到参数lpszFile所指的字符串内。
// lpszFile 存放文件名的字符串。如果该参数为NULL,函数返回需要的字符串长度。
// cch 存放文件名的字符串的长度。

UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);

从上面对函数参数的说明可以看出,该函数支持一次多选多个文件。就像Windows Media Player一样,一次多选好几个文件拖拽到它的窗口中,它就会按顺序播放文件。下面我就用一个有拖拽功能的ListBox为例,说明怎么处理一次拖拽多个文件。

// lxListBox.h

class ClxListBox : public CListBox
{
    DECLARE_DYNAMIC(ClxListBox)

public:
    ClxListBox();
    virtual ~ClxListBox();

afx_msg void OnDropFiles(HDROP hDropInfo);

protected:
    DECLARE_MESSAGE_MAP()    
};

// lxListBox.cpp

#include "stdafx.h"
#include "lxListBox.h"

IMPLEMENT_DYNAMIC(ClxListBox, CListBox)
ClxListBox::ClxListBox()
{ }

ClxListBox::~ClxListBox()
{ }

BEGIN_MESSAGE_MAP(ClxListBox, CListBox)
    ON_WM_DROPFILES()
END_MESSAGE_MAP()

void ClxListBox::OnDropFiles(HDROP hDropInfo)
{
    char szFileName[MAX_PATH];
    int iFileNumber;

// 得到拖拽操作中的文件个数
    iFileNumber = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
    for (int i = 0; i < iFileNumber; i++) 
    {
        // 得到每个文件名
        DragQueryFile(hDropInfo, i, szFileName, MAX_PATH);

if (FindString(0, szFileName) != LB_ERR)
            continue;

// 把文件名添加到list中
        this->AddString(szFileName);
    }

DropFinish(hDropInfo);

CListBox::OnDropFiles(hDropInfo);
}

补充一下,函数DragQueryFile得到的文件名,是带完整路径的文件名。
    最后,提醒一下:要想你的控件具有拖拽功能,一定要把它的Accept Files属性设置为True!要不,上面写的那些代码是不起作用的!

转载于:https://blog.51cto.com/whatever957/1597508

vc文件拖曳(控件)相关推荐

  1. 图解VC++开发ActiveX控件C#调用

    1 新建ActiveX控件工程 2 编译,运行 使用下图所示VC++自带测试工具来测试ActiveX控件: 3 测试容器 插入刚做的ActiveXDemo1控件 4 添加属性 添加名为outstr的属 ...

  2. qt文件选择控件_Qt编写的项目作品2-控件属性设计器(组态)

    一.功能特点 自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个. 拖曳到画布自动生成对应的控件,所见即所得. 右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小 ...

  3. VC++编写ActiveX控件

    前言:ocx是ocx控件的扩展名,OCX 是对象类别扩充组件.如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如Edi ...

  4. 打开文件对话框控件的演示 c# 1614993940

    打开文件对话框控件的演示 c# 1614993940 引入控件 效果 显示控件 代码 效果 默认事件 文件被选中,点了打开后,触发 获取绝对路径 代码 效果 获取文件名 代码 效果 过漏获取指定格式的 ...

  5. html+lt;input+file样式,不同内核的浏览器中文件选择控件的外观也不相同

    标准参考 根据 W3C HTML4.01 规范中的描述,type 属性为 "file" 的 INPUT 元素在浏览器中将被渲染为一个文件选择控件(file select),这种控件 ...

  6. MFC:VS拖拽多个文件到控件并获取路径

    首先需要修改控件的属性. 单击想要接受文件的控件,在右下角属性栏,把Acccept Files改成True 然后Ctrl+Shift+X(或者右键菜单)打开类向导 修改window消息机制,点击&qu ...

  7. VC++ Tab Control控件的基本用法

    VC++ Tab Control控件的基本用法 该程序过程很简单,但是却说明了Tab Control控件的基本用法. 1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后 ...

  8. 淘晶驰串口屏入门(七)数据记录控件、文件浏览器控件、文件流控件

    一.数据记录控件 1.注意data+数字开头的为数据记录控件 2.只有x3和x5系列的串口屏支持数据记录控件,k0,t0和t1系列不支持 3.使用data0.insert方法向数据记录控件添加记录 4 ...

  9. VC使用ActiveX控件常见问题

    转自:http://lingchuangsong.blog.163.com/blog/static/126932322008631104133309/ 一方面,它表示将你联系到Microsoft.In ...

最新文章

  1. 常见NoSQL系统使用场景分析
  2. iPhone用户状告App厂商手脚不干净,偷窥我电脑剪切板干什么
  3. DjangoFreshStore项目一
  4. java实时更新权限_java – 如何使用Spring Security重新加载用户更新的权限
  5. [Vue.js] 基础 -- Vue常用特性
  6. 我靠这个数据分析利器,3年当上运营主管
  7. for循环中包含跨服务查询优化
  8. 照片放大模糊怎么变清晰?
  9. [RK3288][Android7.1]调试笔记 --- Settings设置WLAN热点支持遥控器弹出软键盘输入法
  10. 游戏后台杂谈:后台的语言、系统与构架
  11. GC.SuppressFinalize()的正确用法
  12. arcsinx用计算机怎么算,arcsinx求导(arcsinx如何计算)
  13. 一键备份脚本 backup.sh
  14. oracle06004,Oracle不完全恢复-主动恢复和incarnation/RMAN-20208/RMAN-06004
  15. JS正则表达式完整教程
  16. PT927G光猫获取超管+删除tr069教程
  17. Android字数限制的EditText实现
  18. UICC, CSIM, RUIM, UIM, USIM, SIM
  19. c#.net多线程编程教学(3):线程同步
  20. win10兼容哪些版本的mysql_win10兼容SQL哪个版本?

热门文章

  1. ubuntu ble c语言编程,Ubuntu通过蓝牙连手机上网
  2. react常用生命周期流程图
  3. 使用Pro Event Calendar插件将日历插入WordPress
  4. JS Object() 与 new Object()的区别
  5. 大数据实训笔记10:hive的应用
  6. 计算机未来的发展趋势三百字,用牛顿电脑苹果机器人写作文三百字
  7. 研发的首要目的是什么——一个容易被忽略的问题
  8. 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(21):正定二次型
  9. spring boot 启动事件
  10. STM32平衡小车 TB6612电机驱动学习