高中生斗鸡眼:让你的控件也具有拖拽(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控件。在头文件添加如下的消息响应函数:
- 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!要不,上面写的那些代码是不起作用的!
怎么让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控件