现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,Windows自带的播放软件Windows Media Player,你可以拖着一个媒体文件放到它的主窗口中,它就会开始播放这个文件。
怎么让自己的软件也有这个功能呢?
其实,并不是很难,只要让你需要有拖拽功能的控件响应WM_DROPFILES消息就行了。下面以Edit控件和ListBox控件为例子来说明。
首先,从CEdit继承,自定义一个Edit控件。在头文件添加如下的消息响应函数:
afx_msgvoidOnDropFiles(HDROPhDropInfo);
然后,在cpp文件中的消息映射中添加:
最后,在cpp文件中添加OnDropFiles函数的实现,对拖拽的文件进行处理。下面是完整的代码:
//lxEdit.h
classClxEdit:publicCEdit
{
DECLARE_DYNAMIC(ClxEdit)
public:
ClxEdit();
virtual~ClxEdit();
afx_msgvoidOnDropFiles(HDROPhDropInfo);
protected:
DECLARE_MESSAGE_MAP()
};
//lxEdit.cpp
#include"stdafx.h"
#include"lxEdit.h"
IMPLEMENT_DYNAMIC(ClxEdit,CEdit)
ClxEdit::ClxEdit()
{}
ClxEdit::~ClxEdit()
{}
BEGIN_MESSAGE_MAP(ClxEdit,CEdit)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
voidClxEdit::OnDropFiles(HDROPhDropInfo)
{
//被拖拽的文件的文件名
charszFileName[MAX_PATH+1];
//得到被拖拽的文件名
DragQueryFile(hDropInfo,0,szFileName,MAX_PATH);
//把文件名显示出来
SetWindowText(szFileName);
CEdit::OnDropFiles(hDropInfo);
}
可以看到,在上面的代码中,得到拖拽文件名的是函数DragQueryFile。这是Windows提供的一个API函数,用来得到一次成功的拖拽操作中的文件名。下面是该函数的原型:
//参数说明:
//hDrop句柄,由消息传入。
//iFile文件索引。
//如果该参数值为0xFFFFFFFF,函数返回拖拽操作中的文件数量。
//如果该参数值为0到拖拽文件数量之间的数值,函数将对应索引的文件名拷贝到参数lpszFile所指的字符串内。
//lpszFile存放文件名的字符串。如果该参数为NULL,函数返回需要的字符串长度。
//cch存放文件名的字符串的长度。
UINTDragQueryFile(HDROPhDrop,UINTiFile,LPTSTRlpszFile,UINTcch);
从上面对函数参数的说明可以看出,该函数支持一次多选多个文件。就像Windows Media Player一样,一次多选好几个文件拖拽到它的窗口中,它就会按顺序播放文件。下面我就用一个有拖拽功能的ListBox为例,说明怎么处理一次拖拽多个文件。
//lxListBox.h
classClxListBox:publicCListBox
{
DECLARE_DYNAMIC(ClxListBox)
public:
ClxListBox();
virtual~ClxListBox();
afx_msgvoidOnDropFiles(HDROPhDropInfo);
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()
voidClxListBox::OnDropFiles(HDROPhDropInfo)
{
charszFileName[MAX_PATH];
intiFileNumber;
//得到拖拽操作中的文件个数
iFileNumber=DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);
for(inti=0;i<iFileNumber;i++)
{
//得到每个文件名
DragQueryFile(hDropInfo,i,szFileName,MAX_PATH);
if(FindString(0,szFileName)!=LB_ERR)
continue;
//把文件名添加到list中
AddString(szFileName);
}
CListBox::OnDropFiles(hDropInfo);
}
补充一下,函数DragQueryFile得到的文件名,是带完整路径的文件名。
最后,提醒一下:要想你的控件具有拖拽功能,一定要把它的Accept Files属性设置为True!要不,上面写的那些代码是不起作用的!
分享到:
相关推荐
在.NET中实现窗体控件的内容拖拽效果(Drag-and-Drop)
本函数集的作用,是用户可以 在程序运行时,任意拖动前面板控件,改变布局。
React本机拖动排序拖放排序控件可用于本机版本迭代安装yarn add react-native-drag-sortornpm i react-native-drag-sort --saveexport { DragSortableView, AutoDragSortableView }性能(GIF)...DragSortableView 如果...
目录功能安装和基本用法道具事件提供许可证的演示演示功能轻巧,不依赖所有道具都是React性的支持触摸事件使用可拖动的,可调整大小的控件或同时使用两者定义用于调整大小的标尺将尺寸比例保存为可调整大小的组件...
主要介绍了python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例,需要的朋友可以参考下
支持用shift和ctrl来选择用户要拖动的树的节点和叶子。 功能非常强大。
DevExpress GridControl 控件内部行之间实现拖拽,实际拖拽后行移动过程未实现,可根据实际情况编写,适用GridControl在 winform或DockPanel、UserControl中
VC开发拖拽树形控件设计代码VC + + code for drag and drop tree control design
这是我在网上看到的一个程序,支持对列表控件中项的拖拽,同时有多种选择方式,点选,单行多行选择,可以对项的位置进行拖动改变。功能还是很全面的。很适合大家学习列表控件。压缩包中有完整的VC++6.0工程,可以...
实现Drag Drop拖放元素源码WP7,该源码首先创建两个Canvas控件,分别在Portrait的上下屏显示,在下屛的Canvas中创建一个圆形的元素,通过Interaction.GetBehaviors(ball),获得当前操作行为,通过判断是否为拖动行为...
安卓拖拽控件。 Moving Views In Android – Part 2, Drag and Drop « More Is Not Always Better
网页拖动菜单控件, 还不错的,ajax控件
是有默认拖拽的比如说图片的拖拽选中文本的拖拽链接的拖拽浏览器默认允许我们拖拽图像、文本以及链接让其它元素被拖动也是可以实现的只需要在元素标签上添加一个属性当拖拽这个元素的时候,浏览器就会以半透明复本的...
最新Unity3d UGUI 官方示例下载,包括 1.基础控件 2.Drag And Drop 3.Draggable Panel(拖动面板) 4.Layout Groups 5.Lighting(颜色的变化) 6.Menu 3D 7.RenderTexture
三把匕首 像一样,拖动three.js对象(包括 ),但不修改原始位置。 现场演示可在。安装npm install --save three-dragger CDN版本也可以在unpkg上获得: 用法import ThreeDragger from 'three-dragger' ;const ...
unity3d-reorderable-list Unity的列表控件,允许编辑器开发人员将可重新排序的列表控件添加到其GUI。 支持通用列表和序列化属性数组,尽管可以通过... 插入插入(用于UnityEditor.DragAndDrop )。 如果需要,可以按列
WP7 Drag Drop拖放元素示例源码 程序介绍: WP7中拖放元素的示例程序源码。 首先创建两个Canvas控件,分别在Portrait的上下屏显示。 在下屛的Canvas中创建一个圆形的元素,通过Interaction.GetBehaviors(ball) ...
形式生成器 一个简单的构建器,可帮助您为功能/模块/站点生成超级表单,...易于使用,创建,升级,维护......在可以使用Vue-Form-Builder时,为什么需要对表单进行编码?通过一些额外的步骤来渲染它:D 好处: 开发...
很不错的中文教程!文件太大分3个包! 目录如下: dojo精品中文教程 Dojo.1.0 Practice Note [1] 什么是dojo 选择dojo的理由 AJAX架构之Dojo篇 Adding Ajax中文版 (DoJo) ...利用Dojo实现拖动(Drag and Drop)效果
很不错的中文教程!文件太大分3个包! 目录如下: dojo精品中文教程 Dojo.1.0 Practice Note [1] 什么是dojo 选择dojo的理由 AJAX架构之Dojo篇 Adding Ajax中文版 (DoJo) ...利用Dojo实现拖动(Drag and Drop)效果