高中生斗鸡眼:让你的控件也具有拖拽(drag

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 21:53:38

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

jackyhwei 发布于 2011-11-02 09:21 点击:133次 现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,Windows自带的播放软件Windows Media Player,你可以拖着一个媒体文件放到它的主窗口中,它就会开始播放这个文件。 TAG: 界面编程  拖拽  

现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,Windows自带的播放软件Windows Media Player,你可以拖着一个媒体文件放到它的主窗口中,它就会开始播放这个文件。

怎么让自己的软件也有这个功能呢?

其实,并不是很难,只要让你需要有拖拽功能的控件响应WM_DROPFILES消息就行了。下面以Edit控件和ListBox控件为例子来说明。

首先,从CEdit继承,自定义一个Edit控件。在头文件添加如下的消息响应函数:

  1. afx_msg void OnDropFiles(HDROP hDropInfo); 

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

  1. ON_WM_DROPFILES() 

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

  1. // lxEdit.h 
  2.  
  3. class ClxEdit : public CEdit 
  4.     DECLARE_DYNAMIC(ClxEdit) 
  5.  
  6. public: 
  7.     ClxEdit(); 
  8.     virtual ~ClxEdit(); 
  9.  
  10.     afx_msg void OnDropFiles(HDROP hDropInfo); 
  11.  
  12. protected: 
  13.     DECLARE_MESSAGE_MAP() 
  14. }; 
  15.  
  16. // lxEdit.cpp 
  17.  
  18. #include "stdafx.h" 
  19. #include "lxEdit.h" 
  20.  
  21. IMPLEMENT_DYNAMIC(ClxEdit, CEdit) 
  22. ClxEdit::ClxEdit() 
  23. { } 
  24.  
  25. ClxEdit::~ClxEdit() 
  26. { } 
  27.  
  28. BEGIN_MESSAGE_MAP(ClxEdit, CEdit) 
  29.     ON_WM_DROPFILES() 
  30. END_MESSAGE_MAP() 
  31.  
  32. void ClxEdit::OnDropFiles(HDROP hDropInfo) 
  33.     // 被拖拽的文件的文件名 
  34.     char szFileName[MAX_PATH + 1]; 
  35.     // 得到被拖拽的文件名 
  36.     DragQueryFile(hDropInfo, 0, szFileName, MAX_PATH); 
  37.     // 把文件名显示出来 
  38.     SetWindowText(szFileName); 
  39.  
  40.     CEdit::OnDropFiles(hDropInfo); 
  41.  
  42. //可以看到,在上面的代码中,得到拖拽文件名的是函数DragQueryFile。这是Windows提供的一个API函数,
  43. //用来得到一次成功的拖拽操作中的文件名。下面是该函数的原型: 
  44. // 参数说明: 
  45. // hDrop 句柄,由消息传入。 
  46. // iFile 文件索引。 
  47. //  如果该参数值为0xFFFFFFFF,函数返回拖拽操作中的文件数量。 
  48. //  如果该参数值为0到拖拽文件数量之间的数值,函数将对应索引的文件名拷贝到参数lpszFile所指的字符串内。 
  49. // lpszFile 存放文件名的字符串。如果该参数为NULL,函数返回需要的字符串长度。 
  50. // cch 存放文件名的字符串的长度。 
  51.  
  52. UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch); 
  53.  
  54. //从上面对函数参数的说明可以看出,该函数支持一次多选多个文件。就像Windows Media Player一样,
  55. //一次多选好几个文件拖拽到它的窗口中,它就会按顺序播放文件。下面我就用一个有拖拽功能的ListBox
  56. //为例,说明怎么处理一次拖拽多个文件。 
  57. // lxListBox.h 
  58.  
  59. class ClxListBox : public CListBox 
  60.     DECLARE_DYNAMIC(ClxListBox) 
  61.  
  62. public: 
  63.     ClxListBox(); 
  64.     virtual ~ClxListBox(); 
  65.  
  66.     afx_msg void OnDropFiles(HDROP hDropInfo); 
  67.  
  68. protected: 
  69.     DECLARE_MESSAGE_MAP()     
  70. }; 
  71.  
  72. // lxListBox.cpp 
  73.  
  74. #include "stdafx.h" 
  75. #include "lxListBox.h" 
  76.  
  77. IMPLEMENT_DYNAMIC(ClxListBox, CListBox) 
  78. ClxListBox::ClxListBox() 
  79. { } 
  80.  
  81. ClxListBox::~ClxListBox() 
  82. { } 
  83.  
  84. BEGIN_MESSAGE_MAP(ClxListBox, CListBox) 
  85.     ON_WM_DROPFILES() 
  86. END_MESSAGE_MAP() 
  87.  
  88. void ClxListBox::OnDropFiles(HDROP hDropInfo) 
  89.     char szFileName[MAX_PATH]; 
  90.     int iFileNumber; 
  91.  
  92.     // 得到拖拽操作中的文件个数 
  93.     iFileNumber = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); 
  94.     for (int i = 0; i < iFileNumber; i++)  
  95.     { 
  96.         // 得到每个文件名 
  97.         DragQueryFile(hDropInfo, i, szFileName, MAX_PATH); 
  98.  
  99.         if (FindString(0, szFileName) != LB_ERR) 
  100.             continue; 
  101.  
  102.         // 把文件名添加到list中 
  103.         AddString(szFileName); 
  104.     } 
  105.  
  106.     CListBox::OnDropFiles(hDropInfo); 

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

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

怎么让win2000也具有xpsp2的弹出窗口拦截功能? 怎么让你喜欢的人也喜欢你啊 如何让你想念的对方也想你? draw和drag作“拉”时候的区别? 怎么让 WMP也像暴风影音具有解码 怎样让你自己爱的人也爱上你。 如何让自己具有坚定的毅力! 你的他(她)的什么品质最让你心动,或者希望你的他(她)具有什么样的品质? 寻求具有个性创意的你??? 类型“TextBox”的控件“mycontrol_usernameTextBox”必须放在具有 runat=server 的窗体标记内 在VB中使用data控件时出现类没有注册,查找具有clsid的对象 说出你知道的刷分方式,让管理员也看看,让人家想出对策。 怎么可以找到一个喜欢你的人,而且要让他也喜欢你 你给过你男朋友怎样的惊喜让他很开心也很感动? 你给过你男朋友怎样的惊喜让他很开心也很感动? 你给过你男朋友怎样的惊喜让他很开心也很感动? 你给过你男朋友怎样的惊喜让他很开心也很感动? 为什么我的任务栏里没有Drag'n Drop CD+DVD的图标 极品飞车7中的Drag(一条很直的赛道)怎么玩呀? Anberlin-the feel good drag这首歌曲可以在哪下到?希望音质好些的。 如何在VB的picturebox控件中 让图形适应控件自动调整大小 FOXMAIL具有特快专递功能,怎么样让OUTLOOK也有这个功能啊? 让delphi7.0支持DirectX的控件DelphiX怎样安装? 如何让Windows不阻止无法验证的ActiveX控件