热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MFC单文档实现文件拖拽功能

其实实现的原理很简单,就是让程序响应和处理WM_DROPFILES消息。主要用到三个函数:VOIDDragAcceptFiles(HWNDhWnd,BOOLfAcce

其实实现的原理很简单,就是让程序响应和处理WM_DROPFILES消息。主要用到三个函数:

VOID DragAcceptFiles(      
HWND hWnd,
BOOL fAccept
);
UINT DragQueryFile(      
HDROP hDrop,
UINT iFile,
LPTSTR lpszFile,
UINT cch
);
VOID DragFinish(          HDROP hDrop);

首先我们建立一个MFC的单文档程序,命名为DragFiles

在生成的CDragFilesView类的OnCreate函数的末尾添加一条函数调用

DragAcceptFiles(TRUE);//支持文件拖拽
在MSDN中DragAcceptFiles的描述是这样的

DragAcceptFiles Function

Registers whether a window accepts dropped files.

//注册一个窗口,是否支持拖拽文件

Syntax

VOID DragAcceptFiles(      
HWND hWnd,
BOOL fAccept
);

Parameters

hWnd
The identifier of the window that is registering whether it will accept dropped files.
//需要支持拖拽操作的窗口句柄
fAccept
A value that indicates if the window identified by the hWnd parameter accepts dropped files. This value is TRUE to accept dropped files or FALSE to discontinue accepting dropped files.
一个布尔值,指示是否支持拖拽

Return Value

No return value.

Remarks

An application that calls DragAcceptFiles with the fAccept parameter set to TRUE has identified itself as able to process the WM_DROPFILES message from File Manager.

如果一个应用程序调用了DragAcceptFiles函数并将fAccept参数设置成了TRUE,那么它就指定了自己可以处理来自文件管理器的WM_DROPFILES消息。

Function Information

Minimum DLL Version shell32.dll version 4.0 or later
Custom Implementation No
Header shellapi.h
Import library shell32.lib
Minimum operating systems Windows NT 3.1, Windows 95
可以看到在调用这个API函数的时候需要包含shellapi.h头文件,并且导入lib文件
#pragma comment(lib,"shell32.lib")
但是我们上面调用的函数只有一个参数,这是因为我们调用的那个函数时MFC封装过得函数,是CWnd类的一个成员函数。包含在atlwin.h 中,底层还是调用上面的那个API函数实现的。
由于文档是覆盖在主窗体上的,所以必须用文档类来处理WM_DROPFILES消息。
接下来我们给文档类添加WM_DROPFILES的消息处理函数:
void CDragFilesView::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
UINT nFileNum = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); // 拖拽文件个数
TCHAR strFileName[MAX_PATH]; //定义一个缓冲区,接收文件名字
for (int i = 0; i {
DragQueryFile(hDropInfo, i, strFileName, MAX_PATH);//获得拖曳的文件名
m_vetFileNames.push_back(strFileName); //m_vetFileNames是一个文档类中的成员变量,std::vector 保存文件名
}
DragFinish(hDropInfo); //释放hDrop ,销毁系统为存储拖拽文件的文件名所开辟的内存块

Invalidate(TRUE);//让窗口无效,重绘
CView::OnDropFiles(hDropInfo);
}
在启动拖拽动作时,操作系统会分配一块内存存储拖拽的文件的信息,并通过一个HDROP类型的句柄把该块内存的地址传递给函数OnDropFiles函数。
然后我们调用DragQueryFile。这个函数的原型是:
UINT DragQueryFile(      
HDROP hDrop, //包含拖拽文件的文件名的结构标识
UINT iFile, //拖拽的文件索引,如果是0xFFFFFFFF,那么函数返回拖拽的文件的个数,否则根据索引将文件名字拷贝到lpszFile缓冲区中
LPTSTR lpszFile, //接收文件名的缓冲区,如果是NULL,函数返回缓冲区需要的大小
UINT cch //lpszFile buffer的大小
);
如果iFile设置了0xFFFFFFFF返回拖拽文件的个数,否则返回拷贝文件名的字符数

//为了验证拖拽效果,我们将文件名输出到文档中

//在OnDrow中处理

void CDragFilesView::OnDraw(CDC* pDC)
{
CDragFilesDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码std::vector::iterator pos;int y=0;TEXTMETRIC tm;//系统字体信息结构体pDC->GetTextMetrics(&tm);//获得系统字体信息,为了得到字体高度for(pos=m_vetFileNames.begin();pos!=m_vetFileNames.end();pos++)//将文件名输出{pDC->TextOut(0,y,*pos);y+=tm.tmHeight;}}

最后执行效果:












推荐阅读
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • OBS (Open Broadcaster Software) 架构解析
    本文介绍 OBS(Open Broadcaster Software),一款专为直播设计的开源软件。文章将详细探讨其技术架构、核心组件及其开发环境要求。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 深入探讨栈和队列的应用实例——铁轨问题(Rails, ACM/ICPC CERC 1997, UVa 514)。该问题设定在一个城市火车站,涉及n节车厢从A方向驶入车站,并需按照特定顺序驶出B方向的铁轨。本文将通过算法实现来验证特定顺序的可行性。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
author-avatar
ryan__bug
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有