[ATL/WTL]_[初级]_[拖放文件到窗口]

场景:

1. 软件需要支持从桌面拖动文件到软件里,避免从文件打开窗口选择文件,这样效率快很多,这时就需要窗口支持拖放技术. drag and drop.

2. 软件需要复制文件到远程或设备里,支持拖放的话就很方便.

两种方案:

1. 如果是Windows 窗口程序, 可以使用监听WM_DROPFILES 消息来实现, 这里讲解第一种, 比较方便.

http://blog.csdn.net/laogaoav/article/details/9152181

2. 如果不想监听 WM_DROPFILES 消息,或者是实现 窗口之间拖放,或者把文本拖放到窗口,或者实现一些Shell的操作,需要实现 IDropTarget.

这种方法更强大, 应用范围更广,但是实现起来也比较复杂,而且由于对COM编程不熟悉,所以暂时不考虑.

https://msdn.microsoft.com/en-us/library/ms679679.aspx

第一种方案的步骤:

1. 窗口在创建后,调用 ::DragAcceptFiles(m_hWnd, bAccept); 设置窗口支持接收拖放文件.

2. 在窗口上监听消息 WM_DROPFILES,并实现消息监听函数.

LRESULT OnDropFiles(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774303(v=vs.85).aspx

之后在消息处理函数里实现想要的逻辑.

TCHAR szFilePathName[_MAX_PATH+1] = {0};
HDROP hDrop = (HDROP)wParam;
UINT nFileCount = ::DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
std::vector<std::wstring> paths;
for (UINT nIndex=0 ; nIndex< nFileCount; ++nIndex)
{
	::DragQueryFile(hDrop, nIndex, szFilePathName, _MAX_PATH);
	paths.push_back(szFilePathName);
}
::DragFinish(hDrop);

函数使用查看MSDN即可.

::DragQueryFile : 用来查询拖入的文件路径的.

::DragFinish: 注意, 一定要调用来释放内存, 不然会有内存泄漏.

时间: 2024-10-22 23:11:40

[ATL/WTL]_[初级]_[拖放文件到窗口]的相关文章

[WTL/ATL]_[初级]_[如何使用GetOpenFileName多选文件-根据文件名长度计算lpstrFile长度]

场景: 1. 使用GetOpenFileName 时, 需要预先自定义lpstrFile的长度比如,buf[1024], 但是如果选择的文件过多怎么办?总不能创建一个超大的内存空间吧, 如果选择少时又浪费内存. 2. 微软的MSDN的坏处就是不提供实际的例子,而在别的地方提供,难道他们没遇到这类普通的问题? 3. 这里stackoverflow提供了一个微软使用lpfnHook 的例子来解决这个问题,这个例子对于unicode是有问题的,计算长度没有x2. 这个bug困扰了我半天. 找这个解决方

[ATL/WTL]_[初级]_[常用的界面对象操作]

1. 获取指定大小字体 HFONT AppUtil::GetFont(int pixel,bool bold,const wchar_t* font_name) { LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); // zero out structure lf.lfHeight = pixel; // request a 8-pixel-height font if(bold) { lf.lfWeight = FW_BOLD; } lstrcpy(lf

[ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]

场景 有时候我们需要单独对某个窗口消息进行拦截,比如CEdit响应回车, 这时候就需要拦截窗口处理过程了. 当然MFC的界面可以重载: BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg){ 但是WTL的CEdit并不支持这种方式,WTL如果想在 PreTranslateMessage 里拦截消息,必须继承 CMessageFilter 后还要把这个控件注册到消息循环里才行,也就是必须写子类 或者从父窗口拦截这个CEdit的消息. CMessageLoop*

[ATL/WTL]_[初级]_[窗口如何实现WM_MOUSELEAVE和WM_MOUSEHOVER]

场景: 1.  WTL的控件默认不支持进入和移出的 WM_MOUSEHOVER ,WM_MOUSELEAVE 事件, 即使写了映射也没用, 必须要使用函数 _TrackMouseEvent  添加监听. https://msdn.microsoft.com/en-us/library/windows/desktop/ms645615(v=vs.85).aspx 2. 默认的Window窗口如果有子窗口时, 当进入子窗口时, 会对父窗口调用WM_MOUSELEAVE, 因为子窗口默认会拦截消息,

[ATL/WTL]_[初级]_[转发消息让CStatic支持点击消息操作]

场景: 1. CStatic支持不定长的字符串长度,还可以支持图片背景,当然要父控件响应 WM_CTLCOLORSTATIC 消息. 2. 可以响应点击事件的Cstatic可以当作简单按钮来使用,不需要自定义绘制操作. 3. 普通创建的CStatic不能响应点击时间,需要加上 SS_NOTIFY的 style才可以, 注意AA_STATIC_CLICK是自定义事件ID. #ifndef __DH_STATIC #define __DH_STATIC #include "window/common

[libcurl]_[初级]_[使用libcurl下载大文件]

场景: 1. 在Windows编程时, 下载http页面(html,xml)可以使用winhttp库,但是并不是很下载文件,因为会失败. 由此引出了WinINet库,无奈这个库的稳定性比较低,使用例子又少, 下载大文件时经常是不完整,可查找的资料很少或者是没有特殊情况的解决办法. 2. 我的原则是如果系统有自带的就用系统的,但是 WinINet 要掌握需要花不少时间. 时间因素考虑到了libcurl. 3. libcurl支持ftp,http等协议的文件读取,还能自动获取文件大小, 最重要的是不

[C/C++标准库]_[初级]_[构造文件路径(stringByAppendingPathComponent)]

场景: 1. 很多情况下需要通过文件夹和文件名拼接文件路径字符串,每次都需要判断是否需要添加路径分隔符seperator很麻烦,所以可以写一个通用函数. 2. 大多数情况下都是windows使用wstring,mac使用string,所以用模版实现最通用. 函数: template<class T> T AppendPathComponent(const T& source,const T& component) { int length = source.length();

[C/C++]_[初级]_[使用zlib库压缩文件]

场景: 1. WIndows上没找到系统提供的win32 api来生成zip压缩文件, 有知道的大牛麻烦留个言. 2. zlib比较常用,编译也方便,使用它来做压缩吧.MacOSX平台默认支持zlib库. http://zlib.net 3. zlib库里的 src\contrib\minizip\minizip.c  里有压缩例子, 我现在使用的是zlib 1.2.5,用vs2010编译完.下载地址: http://download.csdn.net/detail/infoworld/8177

[Zlib]_[初级]_[使用zlib库解压提取文件]

场景: 1. zlib库跨平台,Windows和MacOSX都可以使用,还支持64位编译,轻量级,没有不用的道理. 2. 处理.zip,apk,docx文件时,因为这类文件都是zip格式,使用zlib能方便提取压缩文件里的数据. 方法: 1. 除了要使用zlib库本身,还需要使用zlib里的contrib目录minizip部分头文件和.c文件. zlib-1.2.5/src/contrib/minizip/unzip.h unzip.c,ioapi.c,ioapi.h (windows还需要 i