博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转-让你的控件也具有拖拽(drag-and-drop)功能
阅读量:7042 次
发布时间:2019-06-28

本文共 2457 字,大约阅读时间需要 8 分钟。

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

    补充一下,函数DragQueryFile得到的文件名,是带完整路径的文件名。

    最后,提醒一下:要想你的控件具有拖拽功能,一定要把它的Accept Files属性设置为True!要不,上面写的那些代码是不起作用的!

转载地址:http://gwhal.baihongyu.com/

你可能感兴趣的文章
基于VLC的播放器开发
查看>>
[js插件]分享一个文章内容信息提示插件Colortip
查看>>
打开word文档到richtextbox
查看>>
阿里云服务器的坑=====部署EF+MVC
查看>>
(单例设计模式中)懒汉式与饿汉式在多线程中的不同
查看>>
栈和堆(Stack && Heap)
查看>>
Android布局优化之过度绘制
查看>>
removing objects from an array
查看>>
【物联网】QCA4010开发环境的搭建
查看>>
NIO.2 入门,第 2 部分: 文件系统 API
查看>>
在SQL Server中使用种子表生成流水号注意顺序
查看>>
java多线程的等待唤醒机制及如何解决同步过程中的安全问题
查看>>
更快的AtomicInteger
查看>>
iOS 自定义步骤进度条
查看>>
ArcGIS 服务对象扩展(SOE)新手自学笔记(3):REST SOE模板下
查看>>
iOS基础控件之UISegmentedControl
查看>>
【SSH项目实战】国税协同平台-3.资源文件分类&amp;log4j&amp;抽取BaseAction
查看>>
《Redis官方教程》-基准测试
查看>>
C++之继承
查看>>
一分钟了解阿里云产品:E-MapReduce五大热点技术问题分析
查看>>