当前位置:   article > 正文

MFC实现拖动文件到控件

MFC实现拖动文件到控件

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

  1. #pragma once
  2. #define WM_DROPFILESONCTRL WM_USER+100
  3. // CDropFilesList
  4. class CDropFilesList : public CListCtrl
  5. {
  6. DECLARE_DYNAMIC(CDropFilesList)
  7. public:
  8. CDropFilesList();
  9. virtual ~CDropFilesList();
  10. protected:
  11. DECLARE_MESSAGE_MAP()
  12. afx_msg void OnDropFiles(HDROP hDropInfo);
  13. };

CDropFilesList.cpp

  1. // CDropFilesList.cpp: 实现文件
  2. //
  3. #include "pch.h"
  4. #include "CDropFilesList.h"
  5. // CDropFilesList
  6. IMPLEMENT_DYNAMIC(CDropFilesList, CListCtrl)
  7. CDropFilesList::CDropFilesList()
  8. {
  9. }
  10. CDropFilesList::~CDropFilesList()
  11. {
  12. }
  13. BEGIN_MESSAGE_MAP(CDropFilesList, CListCtrl)
  14. ON_WM_DROPFILES()
  15. END_MESSAGE_MAP()
  16. void CDropFilesList::OnDropFiles(HDROP hDropInfo)
  17. {
  18. CWnd *topWindow = AfxGetMainWnd();
  19. if (topWindow)
  20. {
  21. topWindow->SendMessage(WM_DROPFILESONCTRL,(WPARAM) this,(LPARAM) hDropInfo);
  22. }
  23. }
  1. CDropFilesList m_IpList;
  2. DDX_Control(pDX, IDC_IPLIST, m_IpList);//IDC_IPLIST为对话框资源里list的ID。
  3. //添加消息映射
  4. BEGIN_MESSAGE_MAP(CWinBoxToolsDlg, CDialogEx)
  5. 。。。。。。
  6. ON_MESSAGE(WM_DROPFILESONCTRL, DropFilesHandler)
  7. 。。。。。。。
  8. END_MESSAGE_MAP()
  9. //实现消息处理和添加数据
  10. /*
  11. 这里我只实现了List所以直接强转为CDropFilesList,如果你要实现多个类型可以自定义一个结构来区分不同控件做不同逻辑处理LoadTxtToList是我的一个自定义的数据解析函数。根据需要自己实现即可
  12. */
  13. LRESULT CWinBoxToolsDlg::DropFilesHandler(WPARAM pobj, LPARAM pDropInfo)
  14. {
  15. // TODO: 在此添加消息处理程序代码和/或调用默认值
  16. CDropFilesList* list = (CDropFilesList*)pobj;
  17. HDROP hDropInfo = (HDROP)pDropInfo;
  18. if (list == nullptr || hDropInfo == nullptr)
  19. return S_OK;
  20. int count;
  21. TCHAR filePath[MAX_PATH];
  22. //获取拖拽文件总数
  23. count = DragQueryFile(hDropInfo, -1, NULL, 0);
  24. for (UINT i = 0; i < count; i++)
  25. {
  26. int pathLen = DragQueryFile(hDropInfo, i, filePath, MAX_PATH);
  27. LoadTxtToList(filePath, *list);
  28. }
  29. DragFinish(hDropInfo);
  30. return S_OK;
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/144168
推荐阅读
相关标签
  

闽ICP备14008679号