今天使用以前做的工具时,要想把某些文件路径加入编辑框中很麻烦。决定优化一下,能支持把文件拖拽到编辑控件中,这样非常便捷了。省去了输入路径或用浏览框选文件麻烦!
在网上找了一些资料并已解决,决定加以整理分享一下自己的经验。同时感谢网上大拿无私的分享!!
1、首先生成支持拖拽的编辑框类CDropEdit。因为如果对话框中有多个编辑框的话,用对话框响应拖拽消息的话,就无法识别当前文件拖拽到的是什么控件,所以要用专门的类来响应消息就避免了这个问题。
DropEdit.h文件内容如下:
#pragma once
#include "afxwin.h"
// 支持文件拖拽的便捷框类
class CDropEdit : public CEdit
{
public:
CDropEdit(void);
~CDropEdit(void);
afx_msg void OnDropFiles(HDROP hDropInfo);
DECLARE_MESSAGE_MAP()
};
DropEdit.cpp文件内容如下:
#include "stdafx.h"
#include "DropEdit.h"
BEGIN_MESSAGE_MAP(CDropEdit, CEdit)
//{{AFX_MSG_MAP(CDropEdit)
//}}AFX_MSG_MAP
ON_WM_DROPFILES() // 拖拽的响应消息
END_MESSAGE_MAP()
CDropEdit::CDropEdit(void)
{
}
CDropEdit::~CDropEdit(void)
{
}
void CDropEdit::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
char szTmp[256];
CString strVal;
unsigned int nRet = 0, nInx = 0;
// 通过while循环取出拖拽的文件路径,这里我取一个所以直接break
do {
nRet = ::DragQueryFile(hDropInfo, nInx++, szTmp, sizeof(szTmp));
if ( nRet>0) {
strVal += szTmp;
} else {
}
break;
} while (1);
::DragFinish(hDropInfo);
SetWindowText(strVal);
CEdit::OnDropFiles(hDropInfo);
}
2、设置支持拖拽的编辑框的属性:Accpet Files 为True。如下图
3、在类向导中添加成员变量,如图
4、修改向导生成的成员变量的类型CEdit为CDropEdit。
然后编译运行,一切正常。
最后其他需要支持拖拽的控件都可以采用类扩展和继承方式实现。