让CEGUI的Editbox控件支持复制,粘贴
2013-12-26 21:12
267 查看
让CEGUI的Editbox控件支持复制,粘贴。鉴于CEGUI内部,集成太多的东西,不利于维护,因此对windows Clipboard 的API函数的控制,放在客户端实现,同时CEGUI只负责Ctrl+C,Ctrl+V被按下的时候,发出相应的消息即可。
但这样就又引出了新的问题:负责处理该事件的回调函数在lua中,对utf8编码的处理比较烦,关键是没有相应的字符串函数供你调用;回想一下,C++中的insert(),erase(),length()用的这么舒心,你该感概库的强大作用了吧!
没关系,自己动手丰衣足食嘛!首先搞懂UTF8的编码规则:
字符的第一个字节范围: 0x00—0x7F(0-127),或者 0xC2—0xF4(194-244);
0xC0, 0xC1,0xF5—0xFF(192, 193 和 245-255)不会出现在UTF8编码中
0x80—0xBF(128-191)只会出现在第二个及随后的编码中(针对多字节编码,如汉字)
这样我们可以利用lua强大的模式匹配,来实现我们要的效果,关键的处理有这么两个:
local _, count = string.gsub(str, "[^\128-\193]", ""),用来得到str中的字符数
for uchar in string.gfind(str, "[%z\1-\127\194-\244][\128-\191]*") do tab[#tab+1] = uchar end,用来把str中的每个字符映射到tab中
另外附上windows Clipboard的相关API:
{%highlight c++%} if(OpenClipboard(0)) { EmptyClipboard(); HGLOBAL clipbuffer = GlobalAlloc(GMEMDDESHARE,
info.length()+1); char buffer
= (char)GlobalLock(clipbuffer); strcpy(buffer, info.cstr()); GlobalUnlock(clipbuffer); SetClipboardData(CFTEXT,clipbuffer);
CloseClipboard(); } //---------------------------------------------------------------------------- if (!IsClipboardFormatAvailable(CFTEXT) || !OpenClipboard(0)) { return false; } HGLOBAL hMem = GetClipboardData(CF_TEXT); if (hMem != NULL) { LPTSTR lpStr
= (LPTSTR)GlobalLock(hMem); if (lpStr != NULL) { content = std::string((char*)lpStr); GlobalUnlock(hMem); } else content = ""; } else content = ""; CloseClipboard(); {%endhighlight%}
对付一般的应用,这样做足够了;如果高手路过,能有更好的解决方案,欢迎赐教!
但这样就又引出了新的问题:负责处理该事件的回调函数在lua中,对utf8编码的处理比较烦,关键是没有相应的字符串函数供你调用;回想一下,C++中的insert(),erase(),length()用的这么舒心,你该感概库的强大作用了吧!
没关系,自己动手丰衣足食嘛!首先搞懂UTF8的编码规则:
字符的第一个字节范围: 0x00—0x7F(0-127),或者 0xC2—0xF4(194-244);
0xC0, 0xC1,0xF5—0xFF(192, 193 和 245-255)不会出现在UTF8编码中
0x80—0xBF(128-191)只会出现在第二个及随后的编码中(针对多字节编码,如汉字)
这样我们可以利用lua强大的模式匹配,来实现我们要的效果,关键的处理有这么两个:
local _, count = string.gsub(str, "[^\128-\193]", ""),用来得到str中的字符数
for uchar in string.gfind(str, "[%z\1-\127\194-\244][\128-\191]*") do tab[#tab+1] = uchar end,用来把str中的每个字符映射到tab中
另外附上windows Clipboard的相关API:
{%highlight c++%} if(OpenClipboard(0)) { EmptyClipboard(); HGLOBAL clipbuffer = GlobalAlloc(GMEMDDESHARE,
info.length()+1); char buffer
= (char)GlobalLock(clipbuffer); strcpy(buffer, info.cstr()); GlobalUnlock(clipbuffer); SetClipboardData(CFTEXT,clipbuffer);
CloseClipboard(); } //---------------------------------------------------------------------------- if (!IsClipboardFormatAvailable(CFTEXT) || !OpenClipboard(0)) { return false; } HGLOBAL hMem = GetClipboardData(CF_TEXT); if (hMem != NULL) { LPTSTR lpStr
= (LPTSTR)GlobalLock(hMem); if (lpStr != NULL) { content = std::string((char*)lpStr); GlobalUnlock(hMem); } else content = ""; } else content = ""; CloseClipboard(); {%endhighlight%}
对付一般的应用,这样做足够了;如果高手路过,能有更好的解决方案,欢迎赐教!
相关文章推荐
- FarPoint Spread 控件如何实现剪切,粘贴,复制
- c#+Winform实现自定义的“复制、粘贴”右键快捷菜单,多个控件共享使用一个右键菜单。
- DataGridView 控件复制粘贴功能
- WebBrowser控件的复制和粘贴 ---转
- 实用支持移动、PC端的textarea内容复制粘贴小插件
- 可以复制粘贴的控件CCEditBox代码示例
- MFC的CEdit控件中实现复制、粘贴、剪切等操作的快捷键
- Windows的Linux子系统现已支持“复制/粘贴”操作命令_Linux Windows的Linux子系统现已支持“复制/粘贴”操作 命令用法详解:
- Ubuntu 虚拟机支持与windows机器复制粘贴
- 修改Delphi 10.1.2 edit控件在android的复制、剪切和粘贴样式
- 支持直接粘贴IP字符串的CIPAddressCtrl控件
- 自己写了一个支持粘贴复制,类似excel的jquery table小插件
- 无法在短信横屏界面收件人控件中复制粘贴
- c#+Winform实现自定义的“复制、粘贴”右键快捷菜单,多个控件共享使用一个右键菜单
- jquery设置控件不能复制粘贴
- 在RichEdit控件中加入“复制”“粘贴”等功能
- 应用内的控件显示汉语,如复制粘贴
- Windows phone 7更新已经支持复制/粘贴[有图有真相]
- 可以复制粘贴的控件CCEditBox代码示例
- CEdit控件中实现复制、粘贴、剪切等操作的快捷键