本文所用SOUI版本为1.0版本,在拖文件上与一般的消息略有不同。

1.添加拖文件消息响应

先与常规添加消息相同。

class CMainFrm : public SHostWnd
{
public:
CMainFrm(void);
~CMainFrm(void); void OnDropFile(HDROP hDropInfo)
{
SetMsgHandled(FALSE); UINT nFileCount = ::DragQueryFile(hDropInfo, (UINT)-, NULL, );
TCHAR szFileName[_MAX_PATH] = _T("");
DWORD dwAttribute; // 获取拖拽进来文件和文件夹
for (UINT i = ; i < nFileCount; i++)
{
::DragQueryFile(hDropInfo, i, szFileName, sizeof(szFileName));
dwAttribute = ::GetFileAttributes(szFileName); // 是否为文件夹
if ( dwAttribute & FILE_ATTRIBUTE_DIRECTORY )
{
SMessageBox(m_hWnd, "注意:不支持拖拽添加文件夹", "系统提示", MB_OK|MB_ICONWARNING);
}
else
{
std::string file_path = szFileName; //添加代码...........
}
}
::DragFinish(hDropInfo); } void OnClose() ; protected:
//soui消息
EVENT_MAP_BEGIN()
EVENT_NAME_COMMAND(L"btn_close", OnClose)
EVENT_MAP_END() //HostWnd真实窗口消息处理
BEGIN_MSG_MAP_EX(CMainFrm)
MSG_WM_DROPFILES(OnDropFile)
CHAIN_MSG_MAP(SHostWnd)
REFLECT_NOTIFICATIONS_EX()
END_MSG_MAP()
}

到这里完成了SOUI添加消息的比较完整的过程。但是发现窗口并不响应拖文件。

2.使窗口可以拖文件

参考简单方法解决Vista/Win7 无法接收WM_DROPFILES问题 ,添加如下函数

BOOL ChangeWndMessageFilter(UINT uMessage, BOOL bAllow)
{
typedef BOOL (WINAPI* ChangeWindowMessageFilterFn)(UINT, DWORD);
HMODULE hUserMod = NULL;
BOOL bResult = FALSE;
hUserMod = LoadLibrary( "user32.dll" );
if ( hUserMod == NULL )
{
return FALSE;
} // 获取ChangeWindowMessageFilter函数接口指针
ChangeWindowMessageFilterFn pfnChangeWindowMessageFilter = (ChangeWindowMessageFilterFn)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );
if ( pfnChangeWindowMessageFilter == NULL )
{
FreeLibrary( hUserMod );
return FALSE;
} bResult = pfnChangeWindowMessageFilter( uMessage, bAllow?: ); // 1-MSGFLT_ADD, 2-MSGFLT_REMOVE
FreeLibrary( hUserMod );
return bResult;
}

然后在初始化函数中添加如下:

BOOL OnInitDialog(HWND wndFocus, LPARAM lInitParam)
{
SetMsgHandled(FALSE); shellNotifyIcon.Create(m_hWnd,GETRESPROVIDER->LoadIcon(_T("ICON_LOGO"),));
shellNotifyIcon.Show(); m_bLayoutInited=TRUE; //拖文件相关
DragAcceptFiles(m_hWnd, TRUE);
ChangeWndMessageFilter(0x0049, MSGFLT_ADD);
ChangeWndMessageFilter(WM_DROPFILES, MSGFLT_ADD); return TRUE;
}

这样就实现了文件拖曳。

完整代码如下:

class CMainFrm : public SHostWnd
{
public:
CMainFrm(void);
~CMainFrm(void); BOOL ChangeWndMessageFilter(UINT uMessage, BOOL bAllow)
{
typedef BOOL (WINAPI* ChangeWindowMessageFilterFn)(UINT, DWORD);
HMODULE hUserMod = NULL;
BOOL bResult = FALSE;
hUserMod = LoadLibrary( "user32.dll" );
if ( hUserMod == NULL )
{
return FALSE;
} // 获取ChangeWindowMessageFilter函数接口指针
ChangeWindowMessageFilterFn pfnChangeWindowMessageFilter = (ChangeWindowMessageFilterFn)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );
if ( pfnChangeWindowMessageFilter == NULL )
{
FreeLibrary( hUserMod );
return FALSE;
} bResult = pfnChangeWindowMessageFilter( uMessage, bAllow?: ); // 1-MSGFLT_ADD, 2-MSGFLT_REMOVE
FreeLibrary( hUserMod );
return bResult;
} BOOL OnInitDialog(HWND wndFocus, LPARAM lInitParam)
{
SetMsgHandled(FALSE); m_bLayoutInited=TRUE; //拖文件相关
DragAcceptFiles(m_hWnd, TRUE);
ChangeWndMessageFilter(0x0049, MSGFLT_ADD);
ChangeWndMessageFilter(WM_DROPFILES, MSGFLT_ADD); return TRUE;
} void OnDropFile(HDROP hDropInfo)
{
SetMsgHandled(FALSE); UINT nFileCount = ::DragQueryFile(hDropInfo, (UINT)-, NULL, );
TCHAR szFileName[_MAX_PATH] = _T("");
DWORD dwAttribute; // 获取拖拽进来文件和文件夹
for (UINT i = ; i < nFileCount; i++)
{
::DragQueryFile(hDropInfo, i, szFileName, sizeof(szFileName));
dwAttribute = ::GetFileAttributes(szFileName); // 是否为文件夹
if ( dwAttribute & FILE_ATTRIBUTE_DIRECTORY )
{
SMessageBox(m_hWnd, "注意:不支持拖拽添加文件夹", "系统提示", MB_OK|MB_ICONWARNING);
}
else
{
std::string file_path = szFileName; //添加代码...........
}
}
::DragFinish(hDropInfo); } void OnClose() ; protected:
//soui消息
EVENT_MAP_BEGIN()
EVENT_NAME_COMMAND(L"btn_close", OnClose)
EVENT_MAP_END() //HostWnd真实窗口消息处理
BEGIN_MSG_MAP_EX(CMainFrm)
MSG_WM_INITDIALOG(OnInitDialog)
MSG_WM_DROPFILES(OnDropFile)
CHAIN_MSG_MAP(SHostWnd)
REFLECT_NOTIFICATIONS_EX()
END_MSG_MAP() private:
BOOL m_bLayoutInited;/**<UI完成布局标志 */
}

SOUI中启用拖文件的更多相关文章

  1. Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值

    Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能 ...

  2. 无法为数据库 XXX 中的对象XXX 分配空间,因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。

    无法为数据库 XXX 中的对象XXX 分配空间,因为 'PRIMARY' 文件组已满.请删除不需要的文件.删除文件组中的对象.将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘 ...

  3. 为什么在soui中加载JPG文件失败

    在SOUI中解决解码器是一个独立的模块.不同的解码器决定了程序中能够加载什么样的图片类型.使用SComMgr来加载SOUI的模块时,debug模式下默认的图片解码器是imgdecoder-png.这个 ...

  4. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  5. 第五篇:在SOUI中使用XML布局属性指引(pos, offset, pos2type)

    窗口布局的概念 每一个UI都是由大量的界面元素构成的,在Windows编程,这些界面元素的最小单位通常称之为控件. 布局就是这些控件在主界面上的大小及相对位置. 传统的布局一般使用一个4个绝对坐标来定 ...

  6. 第三十四篇:在SOUI中使用异步通知

    概述 异步通知是客户端开发中常见的需求,比如在一个网络处理线程中要通知UI线程更新等等. 通常在Windows编程中,为了方便,我们一般会向UI线程的窗口句柄Post/Send一个窗口消息从而达到将非 ...

  7. 如何在ubuntu中启用SSH服务

    如何在ubuntu14.04 中启用SSH服务 开篇科普:  SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为 ...

  8. 第二十五篇:在SOUI中做事件分发处理

    不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分 ...

  9. 第二十三篇:在SOUI中使用LUA脚本开发界面

    像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑. ...

随机推荐

  1. Zookeeper概述和基本概念

    一.Zookeeper背景 随着互联网技术的发展,企业对计算机系统的计算,存储能力要求越来越高,各大IT企业都在追求高并发,海量存储的极致,在这样的背景下,单纯依靠少量高性能单机来完成计算机,云计算的 ...

  2. 转: MYSQL获取更新行的主键ID

    在某些情况下我们需要向数据表中更新一条记录的状态,然后再把它取出来,但这时如果你在更新前并没有一个确认惟一记录的主键就没有办法知道哪条记录被更新了. 举例说明下: 有一个发放新手卡的程序,设计数据库时 ...

  3. React:快速上手(7)——使用中间件实现异步操作

    React:快速上手(7)——使用中间件实现异步操作 本文参考链接:Stack Overflow redux-thunk 我们使用store.dispath进行派发时,只能传递一个普通对象进去,如下: ...

  4. lower_bound()函数,upper_bound()函数

    1.查找:STL中关于二分查找的函数有三个lower_bound .upper_bound .binary_search .这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两 ...

  5. POJ - 1966 Cable TV Network (最大流求点连通度)

    题意:求一个无向图的点连通度.点联通度是指,一张图最少删掉几个点使该图不连通:若本身是非连通图,则点连通度为0. 分析:无向图的点连通度可以转化为最大流解决.方法是:1.任意选择一个点作为源点:2.枚 ...

  6. 【转】阿里巴巴技术专家杨晓明:基于Hadoop技术进行地理空间分析

    转自:http://www.csdn.net/article/2015-01-23/2823687-geographic-space-base-Hadoop [编者按]交通领域正产生着海量的车辆位置点 ...

  7. Ubuntu中安装Flask模块

    pip3 list——python3下安装的***** #如果列表没有flask pip3 install flask即可

  8. Python基本数据类型之列表

    学习Python的列表类型需要了解和掌握什么是列表.列表的可变性.列表的访问.列表的增删改查等操作~ 1.了解列表 list1 = ['abc', 123, {1, 2, 3},[2,3]] Pyth ...

  9. 20145331实验四 "Android开发基础"

    20145331实验四 "Android开发基础" 程序设计过程 实验内容 ·安装Android Studio ·运行安卓AVD模拟器 ·使用安卓运行出虚拟手机并显示HelloWo ...

  10. 20145331 《Java程序设计》第4周学习总结

    20145331 <Java程序设计>第4周学习总结 教材学习内容总结 •第六章 1.继承的定义与特点: 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法, ...