支持拖拽文件和目录的Edit Control控件派生类

88 篇文章 4 订阅

可以自己以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);
}

欢迎交流与讨论,需要帮助请看头文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值