CEGUI,复制粘贴—— lua,UTF8
让CEGUI的Editbox控件支持复制,粘贴。
鉴于CEGUI内部,集成太多的东西,不利于维护,因此对windows Clipboard 的API函数的控制,放在客户端实现,同时CEGUI只负责Ctrl+C,Ctrl+V被按下的时候,发出相应的消息即可。
但这样就又引出了新的问题:负责处理该事件的回调函数在lua中,对utf8编码的处理比较烦,关键是没有相应的字符串函数供你调用;回想一下,C++中的insert(),erase(),length()用的这么舒心,你该感概库的强大作用了吧!
没关系,自己动手丰衣足食嘛!首先搞懂UTF8的编码规则:
1. 字符的第一个字节范围: 0x00—0x7F(0-127),或者 0xC2—0xF4(194-244);
2. 0xC0, 0xC1,0xF5—0xFF(192, 193 和 245-255)不会出现在UTF8编码中
3. 0x80—0xBF(128-191)只会出现在第二个及随后的编码中(针对多字节编码,如汉字)
这样我们可以利用lua强大的模式匹配,来实现我们要的效果,关键的处理有这么两个:
1. local _, count = string.gsub(str, "[^\128-\193]", ""),用来得到str中的字符数
2. for uchar in string.gfind(str, "[%z\1-\127\194-\244][\128-\191]*") do tab[#tab+1] = uchar end,用来把str中的每个字符映射到tab中
另外附上windows Clipboard的相关API:
if(OpenClipboard(0))
{
EmptyClipboard();
HGLOBAL clipbuffer = GlobalAlloc(GMEM_DDESHARE, info.length()+1);
char *buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, info.c_str());
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
//--------------------------------------------------------
if (!IsClipboardFormatAvailable(CF_TEXT) || !OpenClipboard(0))
{
reutrn 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();
对付一般的应用,这样做足够了;如果高手路过,能有更好的解决方案,欢迎赐教!

最新评论