MFC 实现拖动文件获取文件路径

参考文章:Edit Control实现文件拖拽
                  DragQueryFile

1.文件拖动到对话框

(1)添加消息映射

//CMyTestDlg.cpp
BEGIN_MESSAGE_MAP(CMYstaticTestDlg, CDialog)
	ON_WM_DROPFILES()
END_MESSAGE_MAP()

(2) 将对话框的属性 Accep Files 设置为TRUE
或者
在OnInitDialog()中添加

//CMyTestDlg.cpp
ModifyStyleEx(0,WS_EX_ACCEPTFILES,0);

(3)重写对话框 OnDropFiles 函数

//CMyTestDlg.cpp
void CMyTestDlg::OnDropFiles(HDROP hDropInfo){
	// 通过设置iFiles参数为0xFFFFFFFF,可以取得当前拖动的文件数量,
	// 当设置为0xFFFFFFFF,函数间忽略后面两个参数。
	int DropCount=DragQueryFile(hDropInfo,-1,NULL,0);//取得被拖动文件的数目
	// 循环依次取得拖动文件的File Name信息
	for(int i=0;i< DropCount;i++)
	{
		// 定义一个缓冲区来存放读取的文件名信息
		TCHAR filePath[MAX_PATH];
		DragQueryFile(hDropInfo,i,filePath,MAX_PATH);//获得拖曳的第i个文件的文件名
		//此时 filePath已经获取到了文件路径
		//do something...
	} 
	//拖放结束后,释放内存
	DragFinish(hDropInfo);  
	CDialog::OnDropFiles(hDropInfo);
}

(4)别忘了声明OnDropFiles 函数

//CMyTestDlg.h
afx_msg void OnDropFiles(HDROP hDropInfo);



2.文件拖动到Edit控件

CEdit对 WM_DROPFILES的响应需要在 CEdit的派生类中处理。
(1)创建自定义类MyEdit:

//MyEdit.h
#pragma once
class CMyEdit : public CEdit
{
	DECLARE_DYNAMIC(CMyEdit)

public:
	CMyEdit();
	virtual ~CMyEdit();

protected:
	DECLARE_MESSAGE_MAP()

public:
	afx_msg void OnDropFiles(HDROP hDropInfo);
	virtual void PreSubclassWindow();
};
// MyEdit.cpp : 实现文件
//
#include "stdafx.h"
#include "MyEdit.h"

IMPLEMENT_DYNAMIC(CMyEdit, CEdit)

CMyEdit::CMyEdit()
{
}

CMyEdit::~CMyEdit()
{
}

BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
	ON_WM_DROPFILES()
END_MESSAGE_MAP()

// CMyEdit 消息处理程序
void CMyEdit::OnDropFiles(HDROP hDropInfo)
{
	// 通过设置iFiles参数为0xFFFFFFFF,可以取得当前拖动的文件数量,
	// 当设置为0xFFFFFFFF,函数间忽略后面两个参数。
	int DropCount=DragQueryFile(hDropInfo,-1,NULL,0);//取得被拖动文件的数目
	// 循环依次取得拖动文件的File Name信息
	for(int i=0;i< DropCount;i++)
	{
		// 定义一个缓冲区来存放读取的文件名信息
		TCHAR filePath[MAX_PATH];
		DragQueryFile(hDropInfo,i,filePath,MAX_PATH);//获得拖曳的第i个文件的文件名
		//此时 filePath已经获取到了文件路径
		//do something...
	} 
	//拖放结束后,释放内存
	DragFinish(hDropInfo);  
	CDialog::OnDropFiles(hDropInfo);
}
void CMyEdit::PreSubclassWindow(){
	//也可以在资源视图修改Edit控件的Accep Files 为TRUE
	ModifyStyleEx(0,WS_EX_ACCEPTFILES,0);
	CEdit::PreSubclassWindow();
}

(2)关联自定义类到控件

//声明自定义类对象
//CMyTestDlg.h
CMyEdit m_edit;
//将类对象关联到资源
//CMyTestDlg.pp
void CMyTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1,m_edit);
}



3.提升权限

win7以后 低权限进程向高权限进程发送消息时会被拒绝,即如果用管理员打开软件,资源管理器explorer是没法给该软件发消息的。
解决方法就是 使用 ChangeWindowMessageFilter 从用户界面权限隔离(UIPI)消息筛选器中添加消息。

另外:

[Using the ChangeWindowMessageFilter function is not recommended, as it has process-wide scope. Instead, use the ChangeWindowMessageFilterEx function to control access to specific windows as needed. ChangeWindowMessageFilter may not be supported in future versions of Windows.]

(ChangeWindowMessageFilter 已经不推荐使用 ,可以使用 ChangeWindowMessageFilterEx)

//CMyTestDlg.cpp
//OnInitDialog里
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);       // 0x0049 == WM_COPYGLOBALDATA
要在 MFC实现文件拖拽发送,可以按照以下步骤进行: 1. 在 MFC 对话框的资源视图中添加一个编辑框控件,用于显示拖拽的文件路径。 2. 双击对话框类的头文件 (.h),在类定义中添加以下成员变量和方法: ```cpp CString m_strFilePath; // 保存拖拽的文件路径 afx_msg void OnDropFiles(HDROP hDropInfo); // 拖拽文件的消息处理函数 ``` 3. 在对话框类的源文件 (.cpp) 中添加以下代码: ```cpp BEGIN_MESSAGE_MAP(CYourDialog, CDialogEx) ON_WM_DROPFILES() END_MESSAGE_MAP() CYourDialog::CYourDialog(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_YOUR_DIALOG, pParent) { // ... } void CYourDialog::OnDropFiles(HDROP hDropInfo) { // 获取拖拽的文件数目 UINT nFiles = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, nullptr, 0); // 获取第一个文件路径长度 UINT nPathLen = ::DragQueryFile(hDropInfo, 0, nullptr, 0) + 1; // 获取第一个文件路径 LPWSTR lpwstrFilePath = new WCHAR[nPathLen]; ::DragQueryFile(hDropInfo, 0, lpwstrFilePath, nPathLen); // 将文件路径保存到成员变量中 m_strFilePath = lpwstrFilePath; // 更新编辑框中的文本显示 GetDlgItem(IDC_EDIT_FILEPATH)->SetWindowTextW(m_strFilePath); delete[] lpwstrFilePath; // 调用基类的消息处理函数 CDialogEx::OnDropFiles(hDropInfo); } ``` 4. 在对话框的 OnInitDialog() 函数中添加以下代码,启用文件拖拽功能: ```cpp BOOL CYourDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 启用文件拖拽功能 DragAcceptFiles(TRUE); // ... return TRUE; } ``` 这样,当用户将文件拖拽到对话框上时,文件路径会显示在编辑框中。你可以进一步自定义发送文件的逻辑,例如在拖拽结束后将文件发送到指定的目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值