让CEGUI的Editbox控件支持复制,粘贴

2024-01-26 13:58

本文主要是介绍让CEGUI的Editbox控件支持复制,粘贴,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

让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%}

对付一般的应用,这样做足够了;如果高手路过,能有更好的解决方案,欢迎赐教!

这篇关于让CEGUI的Editbox控件支持复制,粘贴的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/647022

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

禁止复制的网页怎么复制

禁止复制的网页怎么复制 文章目录 禁止复制的网页怎么复制前言准备工作操作步骤一、在浏览器菜单中找到“开发者工具”二、点击“检查元素(inspect element)”按钮三、在网页中选取需要的片段,锁定对应的元素四、复制被选中的元素五、粘贴到记事本,以`.html`为后缀命名六、打开`xxx.html`,优雅地复制 前言 在浏览网页的时候,有的网页内容无法复制。比如「360

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑