vc文件拖曳(控件)
转载地址: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文件拖曳(控件)相关推荐
- 图解VC++开发ActiveX控件C#调用
1 新建ActiveX控件工程 2 编译,运行 使用下图所示VC++自带测试工具来测试ActiveX控件: 3 测试容器 插入刚做的ActiveXDemo1控件 4 添加属性 添加名为outstr的属 ...
- qt文件选择控件_Qt编写的项目作品2-控件属性设计器(组态)
一.功能特点 自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个. 拖曳到画布自动生成对应的控件,所见即所得. 右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小 ...
- VC++编写ActiveX控件
前言:ocx是ocx控件的扩展名,OCX 是对象类别扩充组件.如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如Edi ...
- 打开文件对话框控件的演示 c# 1614993940
打开文件对话框控件的演示 c# 1614993940 引入控件 效果 显示控件 代码 效果 默认事件 文件被选中,点了打开后,触发 获取绝对路径 代码 效果 获取文件名 代码 效果 过漏获取指定格式的 ...
- html+lt;input+file样式,不同内核的浏览器中文件选择控件的外观也不相同
标准参考 根据 W3C HTML4.01 规范中的描述,type 属性为 "file" 的 INPUT 元素在浏览器中将被渲染为一个文件选择控件(file select),这种控件 ...
- MFC:VS拖拽多个文件到控件并获取路径
首先需要修改控件的属性. 单击想要接受文件的控件,在右下角属性栏,把Acccept Files改成True 然后Ctrl+Shift+X(或者右键菜单)打开类向导 修改window消息机制,点击&qu ...
- VC++ Tab Control控件的基本用法
VC++ Tab Control控件的基本用法 该程序过程很简单,但是却说明了Tab Control控件的基本用法. 1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后 ...
- 淘晶驰串口屏入门(七)数据记录控件、文件浏览器控件、文件流控件
一.数据记录控件 1.注意data+数字开头的为数据记录控件 2.只有x3和x5系列的串口屏支持数据记录控件,k0,t0和t1系列不支持 3.使用data0.insert方法向数据记录控件添加记录 4 ...
- VC使用ActiveX控件常见问题
转自:http://lingchuangsong.blog.163.com/blog/static/126932322008631104133309/ 一方面,它表示将你联系到Microsoft.In ...
最新文章
- 常见NoSQL系统使用场景分析
- iPhone用户状告App厂商手脚不干净,偷窥我电脑剪切板干什么
- DjangoFreshStore项目一
- java实时更新权限_java – 如何使用Spring Security重新加载用户更新的权限
- [Vue.js] 基础 -- Vue常用特性
- 我靠这个数据分析利器,3年当上运营主管
- for循环中包含跨服务查询优化
- 照片放大模糊怎么变清晰?
- [RK3288][Android7.1]调试笔记 --- Settings设置WLAN热点支持遥控器弹出软键盘输入法
- 游戏后台杂谈:后台的语言、系统与构架
- GC.SuppressFinalize()的正确用法
- arcsinx用计算机怎么算,arcsinx求导(arcsinx如何计算)
- 一键备份脚本 backup.sh
- oracle06004,Oracle不完全恢复-主动恢复和incarnation/RMAN-20208/RMAN-06004
- JS正则表达式完整教程
- PT927G光猫获取超管+删除tr069教程
- Android字数限制的EditText实现
- UICC, CSIM, RUIM, UIM, USIM, SIM
- c#.net多线程编程教学(3):线程同步
- win10兼容哪些版本的mysql_win10兼容SQL哪个版本?
热门文章
- ubuntu ble c语言编程,Ubuntu通过蓝牙连手机上网
- react常用生命周期流程图
- 使用Pro Event Calendar插件将日历插入WordPress
- JS Object() 与 new Object()的区别
- 大数据实训笔记10:hive的应用
- 计算机未来的发展趋势三百字,用牛顿电脑苹果机器人写作文三百字
- 研发的首要目的是什么——一个容易被忽略的问题
- 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(21):正定二次型
- spring boot 启动事件
- STM32平衡小车 TB6612电机驱动学习