让你的控件也具有拖拽(drag-and-drop)功能

转载 2011年01月24日 10:55:00

让你的控件也具有拖拽(drag-and-drop)功能

现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,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 ClxEdit : 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 "lxEdit.h"

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

ClxEdit::~ClxEdit()
{ }

BEGIN_MESSAGE_MAP(ClxEdit, CEdit)
    ON_WM_DROPFILES()
END_MESSAGE_MAP()

void ClxEdit::OnDropFiles(HDROP hDropInfo)
{
    // 被拖拽的文件的文件名
    char szFileName[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 存放文件名的字符串的长度。

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中
        AddString(szFileName);
    }

    CListBox::OnDropFiles(hDropInfo);
}

Window下拖放操作Drag & Drop 全解析

一、基本概念 拖放,是指用鼠标拖动的方法,在不同程序的窗口之间、同一个程序的不同窗口之间或同一程序同一窗口的不同控件之间,进行移动、复制和粘贴等操作的技术。拖放操作是在操作系统的帮助下完成的。被...
  • u010042142
  • u010042142
  • 2014年06月17日 11:04
  • 1503

练习笔记:使用jQuery实现H5拖放(drag 和 drop)功能

遇到问题1: 在js里面可直接e.dataTransfer.setData("obj_add",e.target.id); 使用jQuery绑定事件时,需e.originalEvent.dataTr...
  • leiliz
  • leiliz
  • 2017年02月08日 14:46
  • 3408

angular拖动插件——ng-drag、ng-drop

转自:http://blog.csdn.net/zcl_love_wx/article/details/51691631 1.相关地址: 插件下载:https://github.com/f...
  • Inuyasha1121
  • Inuyasha1121
  • 2017年06月25日 13:50
  • 2876

【自定义控件】让你的控件也具有拖拽(drag-and-drop)功能 详细版

转自:  现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,Windows自带的播放软件Windows Media Player,你可以拖着...
  • vsooda
  • vsooda
  • 2013年05月08日 20:41
  • 2880

#695 – 实现一个简单的拖拽(Implementing Drag-and-Drop Behavior)

下面例子中的代码实现了从一个TextBox 中拖拽文字到一个ListBox 里。 在XAML中,我们指定TextBox 的MouseDown 事件处理韩式和ListBox 的Drop 事件处理函数。并...
  • Libby1984
  • Libby1984
  • 2017年04月17日 17:44
  • 237

SWT 应用程序 实现的Drag and Drop(DND) 和 GEF 树上元素的拖拽

Drag and drop 提供了一种在应用程序-应用程序中重新利用或者是转换数据的方法。本文讲述了如何在一个SWT应用程序中使用Drag 和 Drop机制和如何使用剪贴版转换数据。Drag and ...
  • m_hahahaha1994
  • m_hahahaha1994
  • 2016年06月13日 08:44
  • 286

VC实现文件管理器拖拽(Drag-and-Drop)

VC实现文件管理器拖拽(Drag-and-Drop) 在日常的程序中,为了操作的方便,经常需要使用鼠标拖拽的方式把文件管理器中的文件拖拽到我们自己写的程序中,以下就简单介绍以下实现该操作的方法。...
  • laogaoAV
  • laogaoAV
  • 2013年06月22日 19:25
  • 1376

分享一个HTML5的drag and drop API实现的图片拖拽分组效果

来源:GBin1.com 在线演示 本地下载 今天我们介绍HTML5的拖拽功能。基本目前所有的现代浏览器(Firefox,Chrome,Safari,或者Opera)都支持这个实用的功能。这意...
  • load_life
  • load_life
  • 2012年05月19日 12:23
  • 408

分享一个HTML5的drag and drop API实现的图片拖拽分组效果

日期:2012-4-17  来源:GBin1.com 在线演示  本地下载 今天我们介绍HTML5的拖拽功能。基本目前所有的现代浏览器(Firefox,Chrome,Safari,...
  • jjfat
  • jjfat
  • 2012年04月17日 18:15
  • 1021

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

Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结   1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制.必须有Dr...
  • attilax
  • attilax
  • 2014年12月12日 23:36
  • 1233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让你的控件也具有拖拽(drag-and-drop)功能
举报原因:
原因补充:

(最多只允许输入30个字)