类似文章也有很多,本文原始代码也是来自网络的整理。实测功能正常。
下面提供源码,使用说明包含在源码的头文件里。额外说明下,这个源码目前只支持单个文件的拖入,如果需要多文件同时拖入,要自行改造。这里提供的是仅编辑框(Edit)控件接受文件拖入,而不是整个窗口去接受文件拖入。
cpp
//这是.h代码
#pragma once
/*
前置说明:程序最好拥有管理远权限,不然可能有些路径文件不能拖入吧
1.在dlg.h里面添加#include "dropedit.h"
2.在界面编辑器里面给edit添加控件变量,变量类型就是CDropEdit
3.给edit控件属性AcceptFiles设置为TRUE
4.在dlg.cpp里面OnInitDialog函数中添加
AllowMeesageForVistaAbove(SPI_SETANIMATION, MSGFLT_ADD);
AllowMeesageForVistaAbove(WM_DROPFILES, MSGFLT_ADD);
两个方法
*/
#include "afxwin.h"
BOOL AllowMeesageForVistaAbove(UINT uMessageID, BOOL bAllow);
class CDropEdit :
public CEdit
{
public:
CDropEdit(void);
~CDropEdit(void);
DECLARE_MESSAGE_MAP()
afx_msg void OnDropFiles(HDROP hDropInfo);
};
cpp
/这是cpp代码
#include "StdAfx.h"
#include "DropEdit.h"
BOOL AllowMeesageForVistaAbove(UINT uMessageID, BOOL bAllow)
{
BOOL bResult = FALSE;
HMODULE hUserMod = NULL;
//vista and later
hUserMod = LoadLibrary(_T("user32.dll"));
if( NULL == hUserMod )
{
return FALSE;
}
typedef BOOL(WINAPI *_ChangeWindowMessageFilter)(UINT, DWORD);
_ChangeWindowMessageFilter pChangeWindowMessageFilter = (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, "ChangeWindowMessageFilter");
if( NULL == pChangeWindowMessageFilter )
{
return FALSE;
}
bResult = pChangeWindowMessageFilter( uMessageID, bAllow ? 1 : 2 );//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2
if( NULL != hUserMod )
{
FreeLibrary( hUserMod );
}
return bResult;
}
CDropEdit::CDropEdit(void)
{
}
CDropEdit::~CDropEdit(void)
{
}
BEGIN_MESSAGE_MAP(CDropEdit, CEdit)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
void CDropEdit::OnDropFiles(HDROP hDropInfo)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (hDropInfo)
{
int nDrag; //拖拽文件的数量
nDrag = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
if (nDrag == 1)
{
// 被拖拽的文件的文件名
TCHAR Path[MAX_PATH + 1] = { 0 };
// 得到被拖拽的文件名
DragQueryFile(hDropInfo, 0, Path, MAX_PATH);
// 把文件名显示出来
SetWindowText(Path);
DragFinish(hDropInfo);
}
else
{
MessageBox(_T("只能拖拽一个文件!"));
}
}
CEdit::OnDropFiles(hDropInfo);
}
上述.h里面也说了,引入后添加控件变量,需要在OnInitDialog里面添加消息允许之类的。参照着来就行。