1、继承需要实现的拖动功能的控件。
2、定义一个消息将拖动事件转发到窗口上执行。(非必须,但是我们一般的逻辑都在主窗口上)
3、添加继承控件的消息处理函数 ON_WM_DROPFILES
void CXXX::OnDropFiles(HDROP hDropInfo)
{
CWnd *topWindow = AfxGetMainWnd();
if (topWindow)
{
topWindow->SendMessage(WM_DROPFILESONCTRL,(WPARAM) this,(LPARAM) hDropInfo);
}
}
BEGIN_MESSAGE_MAP(CXXX, XXXXX)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
4、使用DDX_Control关联控件
5、在窗口处理转发过来的事件。
这里以定义一个List为例。
CDropFilesList.h
#pragma once#define WM_DROPFILESONCTRL WM_USER+100
// CDropFilesListclass CDropFilesList : public CListCtrl
{DECLARE_DYNAMIC(CDropFilesList)public:CDropFilesList();virtual ~CDropFilesList(); protected:DECLARE_MESSAGE_MAP()afx_msg void OnDropFiles(HDROP hDropInfo);
};
CDropFilesList.cpp
// CDropFilesList.cpp: 实现文件
//#include "pch.h"
#include "CDropFilesList.h"// CDropFilesListIMPLEMENT_DYNAMIC(CDropFilesList, CListCtrl)CDropFilesList::CDropFilesList()
{}CDropFilesList::~CDropFilesList()
{
}BEGIN_MESSAGE_MAP(CDropFilesList, CListCtrl)ON_WM_DROPFILES()
END_MESSAGE_MAP()void CDropFilesList::OnDropFiles(HDROP hDropInfo)
{CWnd *topWindow = AfxGetMainWnd();if (topWindow){topWindow->SendMessage(WM_DROPFILESONCTRL,(WPARAM) this,(LPARAM) hDropInfo);}
}
CDropFilesList m_IpList;DDX_Control(pDX, IDC_IPLIST, m_IpList);//IDC_IPLIST为对话框资源里list的ID。//添加消息映射
BEGIN_MESSAGE_MAP(CWinBoxToolsDlg, CDialogEx)。。。。。。ON_MESSAGE(WM_DROPFILESONCTRL, DropFilesHandler) 。。。。。。。
END_MESSAGE_MAP()//实现消息处理和添加数据
/*
这里我只实现了List所以直接强转为CDropFilesList,如果你要实现多个类型可以自定义一个结构来区分不同控件做不同逻辑处理LoadTxtToList是我的一个自定义的数据解析函数。根据需要自己实现即可
*/
LRESULT CWinBoxToolsDlg::DropFilesHandler(WPARAM pobj, LPARAM pDropInfo)
{// TODO: 在此添加消息处理程序代码和/或调用默认值CDropFilesList* list = (CDropFilesList*)pobj;HDROP hDropInfo = (HDROP)pDropInfo;if (list == nullptr || hDropInfo == nullptr)return S_OK;int count;TCHAR filePath[MAX_PATH];//获取拖拽文件总数count = DragQueryFile(hDropInfo, -1, NULL, 0);for (UINT i = 0; i < count; i++){int pathLen = DragQueryFile(hDropInfo, i, filePath, MAX_PATH);LoadTxtToList(filePath, *list);}DragFinish(hDropInfo);return S_OK;
}