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做用户交互的逻辑. ...
随机推荐
- Jenkins节点配置页面,启动方法没有"Launch agent via Java Web Start"解决方法?
Jenkins的配置从节点中默认没有Launch agent via JavaWeb Start,解决办法: 步骤: 1:打开"系统管理"——"Configure Glo ...
- 推荐系统第5周--- 基于内容的推荐,隐语义模型LFM
基于内容的推荐
- quick-cocos2d-x + Lua 开发
quick-cocos2d-x + Lua 开发 quick-cocos2d-x + Lua 开发 首页在Eclipse中搭建quick-cocos2d-x的lua开发环境. 1. 首先需要 ...
- 获取IE (控件)的所有链接(包括Frameset, iframe)
获取IE (控件)的所有链接(包括Frameset, iframe) IE 顶层 body 节点通过IHTMLElement->get_all 方法无法获取iframe 里面的节点列表 CCom ...
- VUE 2.0在IE中打开页面空白的原因及解决方法
前言 因为工作的需要,学习Vue2.0也有一段时间,最近在用Vue2.0的官方脚手架工具构建的项目,chrome中跑一直没有问题,但ie打开出现了bug: 问题 ie打开vue2.0项目空白,控制台报 ...
- SQL Server窗口框架——ROWS、RANGE
说到窗口框架就不得不提起开窗函数. 开窗函数支持分区.排序和框架三种元素,其语法格式如下: OVER ( [ <PARTITION BY clause> ] [ <ORDER BY ...
- XDU 1164 男神的树(树+lazy数组)
#include<cstdio> #include<cmath> #include<cstring> #include<vector> #define ...
- 一个App项目设计开发完整流程
作为一个PHP程序猿想转行APP开发可不是件容易的事情,话说隔行如隔山,这隔着一层语言也是多东西需要学习啊,一直对APP开发很感兴趣,最近请教了几个做移动开发的朋友,看了很多的资料,决定把自己学到的东 ...
- 从u-boot的编译结果中提取include目录
ac@DESKTOP-BJ1MJGM:~/u-boot-2019.01/spl$ arm-linux-gnueabihf-objdump -g u-boot-spl | awk '/The Direc ...
- 【转】Google的2012论文
转自:http://www.sigvc.org/bbs/thread-1152-1-1.html Google的论文一直是业界的风向标,尤其在机器学习.分布式系统.网络等方面很多创新性的成果都是由他们 ...