可以自己以CEdit类为基类派生,也挺简单,也可以直接使用我提供的派生类,添加到项目,关联控件变量,然后把控件变量的类型更改成此类即可。
注意,控件的AcceptFiles必须设置为TRUE,否则代码无法生效。
CMyEdit m_eDstDir;
说明
1.支持同时拖拽多个文件或者目录
2.支持设置只允许拖拽文件或者目录
3.支持设置只允许拖拽单个项目
//只能拖拽单个目录
m_eDstDir.SetFlag(EDIT_DIR_JUDGE | EDIT_SIG_JUDGE);
下面是源代码:
//author:autumoon
//2020.09.25 联系QQ4589968
#pragma once
/*使用范例m_eDstDir.SetFlag(EDIT_DIR_JUDGE | EDIT_SIG_JUDGE);*/
#define EDIT_NONE_JUDGE 0x0000 //无判断
#define EDIT_FILE_JUDGE 0x0001 //判断是否为文件
#define EDIT_DIR_JUDGE 0x0002 //判断是否为目录
#define EDIT_SIG_JUDGE 0x0004 //是否设置只允许单个项目
// CMyEdit
class CMyEdit : public CEdit
{
DECLARE_DYNAMIC(CMyEdit)
public:
CMyEdit();
virtual ~CMyEdit();
//设置拖拽项目类型判断
void SetFlag(const int& nFlag = EDIT_NONE_JUDGE){m_nFlag = nFlag;}
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDropFiles(HDROP hDropInfo);
private:
int m_nFlag;
};
然后是cpp文件:
// MyEdit.cpp : 实现文件
//
#include "stdafx.h"
#include "DllTestor.h"
#include "MyEdit.h"
// CMyEdit
IMPLEMENT_DYNAMIC(CMyEdit, CEdit)
CMyEdit::CMyEdit():m_nFlag(EDIT_NONE_JUDGE)
{
}
CMyEdit::~CMyEdit()
{
}
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
// CMyEdit 消息处理程序
void CMyEdit::OnDropFiles(HDROP hDropInfo)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(hDropInfo)
{
//拖拽文件的数量
UINT nDrag = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
//只拖拽一个文件
if (nDrag > 1 && (m_nFlag & EDIT_SIG_JUDGE))
{
nDrag = 1;
}
// 被拖拽的文件的文件名
TCHAR* szItemPath = new TCHAR[MAX_PATH + 1]();
CString strAllPath;
for (UINT i = 0; i < nDrag; ++i)
{
memset(szItemPath, 0, sizeof(TCHAR) * (MAX_PATH + 1));
DragQueryFile(hDropInfo, i, szItemPath, MAX_PATH);
if (PathFileExists(szItemPath) == TRUE)
{
//根据类型判断
if ((m_nFlag & EDIT_DIR_JUDGE) && PathIsDirectoryA(szItemPath))
{
strAllPath += szItemPath;
}
else if ((m_nFlag & EDIT_FILE_JUDGE) && !PathIsDirectoryA(szItemPath))
{
strAllPath += szItemPath;
}
else if (m_nFlag == EDIT_NONE_JUDGE)
{
strAllPath += szItemPath;
}
//超一个项目的时添加间隔符
if (nDrag > 1)
{
strAllPath += ";";
}
}
SetWindowText(strAllPath);
}
delete[] szItemPath;
szItemPath = nullptr;
}
CEdit::OnDropFiles(hDropInfo);
}
欢迎交流与讨论,需要帮助请看头文件。