windows客户端开发--使你的输入框具有拖拽上传的功能

今天谈一天windows客户端拖拽上传功能。

其实主要是拖拽功能,上传是自己实现的。

DragAcceptFiles 函数

最重要的就是这个函数了,看看作用:

Registers whether a window accepts dropped files

原型:

VOID DragAcceptFiles(
   HWND hWnd,
   BOOL fAccept
);

参数:

hWnd

Type: HWND

The identifier of the window that is registering whether it will accept dropped files.

fAccept

Type: BOOL

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.

头文件以及库:

Shellapi.h

Shell32.lib

这就很简单了,首先获得一个窗口的句柄,然后调用DragAcceptFiles 函数:

    DragAcceptFiles(m_hWnd, TRUE);

接下来就是消息响应了~~~

WM_DROPFILES 消息

Sent when the user drops a file on the window of an application that has registered itself as a recipient of dropped files.

现在就要处理WM_DROPFILES消息了:

DragQueryFile函数

Retrieves the names of dropped files that result from a successful drag-and-drop operation.

(在完成)一个成功拖放操作后获取被拖放文件的名称等信息。

原型:

UINT DragQueryFile(
  _In_  HDROP  hDrop,
  _In_  UINT   iFile,
  _Out_ LPTSTR lpszFile,
        UINT   cch
);

参数:

hDrop [in]

Type: HDROP

Identifier of the structure that contains the file names of the dropped files.

iFile [in]

Type: UINT

Index of the file to query. If the value of this parameter is 0xFFFFFFFF, DragQueryFile returns a count of the files dropped. If the value of this parameter is between zero and the total number of files dropped, DragQueryFile copies the file name with the corresponding value to the buffer pointed to by the lpszFile parameter.

lpszFile [out]

Type: LPTSTR

The address of a buffer that receives the file name of a dropped file when the function returns. This file name is a null-terminated string. If this parameter is NULL, DragQueryFile returns the required size, in characters, of this buffer.

cch

Type: UINT

The size, in characters, of the lpszFile buffer.

重点看返回值:

Type: UINT

A nonzero value indicates a successful call.

When the function copies a file name to the buffer, the return value is a count of the characters copied, not including the terminating null character.

If the index value is 0xFFFFFFFF, the return value is a count of the dropped files. Note that the index variable itself returns unchanged, and therefore remains 0xFFFFFFFF.

If the index value is between zero and the total number of dropped files, and the lpszFile buffer address is NULL, the return value is the required size, in characters, of the buffer, not including the terminating null character.

可以通过这个返回值来判断拖拽的是否为单个文件。

看到了第一个参数

HDROP

HDROP hDrop = (HDROP)wParam

DragFinish函数

Releases memory that the system allocated for use in transferring file names to the application

windows编程永远要记住,获取资源后要释放。

GetFileAttributes函数

GetFileAttributes Function为一个指定的文件或目录返回文件系统的属性。

如果判断拖拽的是否为文件夹可以这样:

GetFileAttributes(file_path)&FILE_ATTRIBUTE_DIRECTORY

最后献上菊花,手滑了,是献上完整代码:

            HDROP hDrop = (HDROP)wParam;
            UINT nFileNum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
            TCHAR file_path[MAX_PATH];

            DragQueryFile(hDrop, 0, file_path, MAX_PATH);

            DragFinish(hDrop);      //释放hDrop  

            if (GetFileAttributes(file_path)&FILE_ATTRIBUTE_DIRECTORY)
            {
                MessageBox(NULL, L"只允许拖拽单个文件", L"拖拽文件", NULL);
            }
            else if (nFileNum > 1)
            {
                MessageBox(NULL, L"只允许拖拽单个文件", L"拖拽文件", NULL);
            }
            else
            {
                //上传单个文件
            }
        }
时间: 2024-10-29 10:45:48

windows客户端开发--使你的输入框具有拖拽上传的功能的相关文章

windows客户端开发--使你的客户端运行时记住上次关闭的大小和位置

几乎所有的windows客户端都可以调整大小,所以用户根据自己的喜好调整客户端的大小和位置. 但是当该客户端退出后,重新运行客户端的时候,我们往往又要调整自己喜好的大小和位置. 微信的windows客户端做了记住客户端退出时候的大小和位置,下次运行的时候直接,窗口直接显示为你喜好的大小和位置. 现在的任务就是八一八这个小小的功能. 首先,你肯定是想到了使用配置文件.再客户端退出的时候,把客户端窗口的信息记录在一个配置文件中,一般都是.ini文件.读写配置文件 很简单,这里就不再赘述了. 但是使用

windows客户端开发调试工具

本文介绍windows常用开发与调试工具. 1.windows常用开发与调试工具 1.1 Sysinternals 内核大神打造,含大量windows系统工具,windows开发必备神器,大神被MS招安. 下载地址:http://technet.microsoft.com/en-us/sysinternals Procmon.exe 监视程序运行过程中的动作,可用于性能监控. procexp.exe 相当于升级版的任务管理器,可以查看加载模块,模块查找,线程列表(含CPU百分比), 创建dump

windows客户端开发--也许是一条不归路

如今的Windows客户端开发,已经被同行嘲笑为鸡肋,甚至有些人认识做Windows客户端就是一个笑柄. 食之无味,弃之可惜. 不可否认,PC端没落的很快. 但是想说的是,任何一门技术都有存在的道理. 微软就是所有Windows客户端开发人员的大腿,虽然这个大腿让人捉摸不定,主方向总是变化. 换言之,Windows客户端开发难度不小.如果你能轻松的驾驭指针.内存.类等等,即使有一个Windows客户端彻底完蛋了,你也许只用一个星期或是一个月就掌握了另一种编程语言开发. 重要的是思想~ 我个人认为

Windows客户端开发简介(一)

在这样一个移动当道的年代,我跟大家讨论Windows客户端开发,似乎有些倚老卖老的意思了.然而我却觉得无论什么时候,Windows客户端开发其实还是有着不少实用经典的技术的.对了,确切说我是要说说Windows C++客户端开发,什么WinForm,WPF,并不在讨论范围之内,我承认用.NET ,C#做Windows客户端对开发人员来说确实是件轻松愉快的事,但是因为这些技术由于种种原因(主要还是效率问题)在经典的Windows客户端程序采用的少之又少,所以我打算把他们略过. 我并不是什么微软技术

C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

原文:C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 第四,第五章已经讲了怎么处理用户发送的消息,本章就来讲讲怎么响应用户的

实现Magento多文件上传代码功能开发

在Magento中上传单个文件很简单,可以直接在继承的Mage_Adminhtml_Block_Widget_Form类中直接添加如下组件Field: 对于图片: $fieldset->addField('test_pic', 'image', array( 'label' => "标签", 'name' => 'test_pic', )); 对于文件: $fieldset->addField('test_file', 'file', array( 'label

iOS开发拓展篇—xib中关于拖拽手势的潜在错误

iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行程序,程序直接崩溃,报错如下: 说明:手势不会有superView方法,superView是UIView的方法,说明我们错误的把手势对象当成是UIView来用了. 调试查看出现问题的原因: 出现问题的原因: 说明:通过lastObject取出来的对象是手势,而不是xib,因此出现上面的错误. 把la

IOS开发UI篇—手势识别器(拖拽+旋转+缩放)

IOS开发UI篇—手势识别器(拖拽+旋转+缩放) 一.拖拽 示例代码: 1 // 2 // YYViewController.m 3 // 06-拖拽事件 4 // 5 // Created by apple on 14-6-19. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 11 @interface YYViewController ()

Windows客户端开发简介(二)

一个典型的Windows客户端程序要有哪几部分构成呢?下面我会以一个国内比较流行的互联网客户端程序的基本架构来跟大家逐步展开分析,由于涉及到知识产权的问题,请大家不要问我是什么产品,当然,如果你能猜到,那我就管不着了^_^. 某视频影音互联网PC客户端产品基本架构 如上只是个粗略的分层架构图,没有更细致的划分,但是有几个地方是需要特别关注的,比如最上层的那几个部分,音视频解码引擎,UI引擎,WebKit浏览器内核,内核通信模块,日志系统. 因为音视频解码引擎和内核通信模块只是对于视频客户端和P2