SOUI中启用拖文件
本文所用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中启用拖文件的更多相关文章
- Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值
Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能 ...
- 无法为数据库 XXX 中的对象XXX 分配空间,因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。
无法为数据库 XXX 中的对象XXX 分配空间,因为 'PRIMARY' 文件组已满.请删除不需要的文件.删除文件组中的对象.将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘 ...
- 为什么在soui中加载JPG文件失败
在SOUI中解决解码器是一个独立的模块.不同的解码器决定了程序中能够加载什么样的图片类型.使用SComMgr来加载SOUI的模块时,debug模式下默认的图片解码器是imgdecoder-png.这个 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- 第五篇:在SOUI中使用XML布局属性指引(pos, offset, pos2type)
窗口布局的概念 每一个UI都是由大量的界面元素构成的,在Windows编程,这些界面元素的最小单位通常称之为控件. 布局就是这些控件在主界面上的大小及相对位置. 传统的布局一般使用一个4个绝对坐标来定 ...
- 第三十四篇:在SOUI中使用异步通知
概述 异步通知是客户端开发中常见的需求,比如在一个网络处理线程中要通知UI线程更新等等. 通常在Windows编程中,为了方便,我们一般会向UI线程的窗口句柄Post/Send一个窗口消息从而达到将非 ...
- 如何在ubuntu中启用SSH服务
如何在ubuntu14.04 中启用SSH服务 开篇科普: SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为 ...
- 第二十五篇:在SOUI中做事件分发处理
不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分 ...
- 第二十三篇:在SOUI中使用LUA脚本开发界面
像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑. ...
随机推荐
- Curl https 访问
如果访问https的网页,出现: curl: (60) SSL certificate problem: unable to get local issuer certificate 将 将 CURL ...
- flask自定义session
根据内置session原理可以进行session的定制: #!/usr/bin/env python # -*- coding:utf-8 -*- import uuid import json fr ...
- vertical-align和line-height的深入应用
vertical-align和line-height的深入应用 本文的重点是了解vertical-align和line-height的使用 涉及到的名词:基线,底端,行内框,行框,行间距,替换元素及非 ...
- CCF 权限查询(模拟)
试题编号: 201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统 ...
- PV、TPS、QPS是怎么计算出来的?
PV=page viewTPS=transactions per secondQPS=queries per secondRPS=requests per second RPS=并发数/平均响应时间 ...
- SpringMVC整合ActiveMQ
spring activeMq 配置 <!-- ActiveMQ 连接工厂 --> <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服 ...
- NetBeans 启动时出现 Invalid jdkhome specified提示
执行 NetBeans 出现如下文字内容: Invalid jdkhome specifiedCannot locate java installation in specifired jdkhome ...
- oracle中修改表已有数据的某一列的字段类型的方法,数据备份
1.在开发过程中经常会遇到表中的某一个字段数据类型不对,比如说需要保存的数据带小数,但是在最初设计的时候是给的number(10)类型,开始保存是整数的时候满足要求,后来在保存小数的时候 会发现自动四 ...
- php项目代码 编码格式不对会大范围报错
php项目代码 编码格式不对会大范围报错
- 20145312 《Java程序设计》第八周学习总结
20145312 <Java程序设计>第八周学习总结 学习笔记 Chapter 15时间与日期 15.1 日志 15.1.1 日志API简介 java.util.logging包提供了日志 ...