cocos2dx 3.2 解决输入框(TextField,TextFieldTTF) 中文乱码问题

86 篇文章 0 订阅

最近开发cocos2dx 项目,做一个小游戏。(个人喜欢用最新版本)

  没系统学习就是问题多多,遇到了很多问题,比如所有的opengl api都必须在主线程中调用,

这让我在多线程加载方面吃了不少亏,浪费了很多时间。

 这次遇到了输入框中输入中文出现乱码问题。搜索了很多方法,都没找到。没办法。但是知道cocos2dx 2.x版本没有这个问题,所以就只有跟进代码了。

 

首先 找到2.x中找到WM_CHAR的派发消息:

platform/win32/下的CCEGLView.cpp 中 LRESULT CCEGLView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)里面可以找到,

不说了,直接贴代码:

 

case WM_CHAR: 
        { 
            if (wParam < 0x20) 
            { 
                if (VK_BACK == wParam) 
                { 
                    CCIMEDispatcher::sharedDispatcher()->dispatchDeleteBackward(); 
                } 
                else if (VK_RETURN == wParam) 
                { 
                    CCIMEDispatcher::sharedDispatcher()->dispatchInsertText("\n", 1); 
                } 
                else if (VK_TAB == wParam) 
                { 
                    // tab input 
                } 
                else if (VK_ESCAPE == wParam) 
                { 
                    // ESC input 
                    //CCDirector::sharedDirector()->end(); 
                } 
            } 
            else if (wParam < 128) 
            { 
                // ascii char 
                CCIMEDispatcher::sharedDispatcher()->dispatchInsertText((const char *)&wParam, 1); 
            } 
            else 
            { 
                char szUtf8[8] = {0}; 
                int nLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&wParam, 1, szUtf8, sizeof(szUtf8), NULL, NULL); 
                CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(szUtf8, nLen); 
            } 
            if ( m_lpfnAccelerometerKeyHook!=NULL ) 
            { 
                (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam ); 
            } 
        } 
        break; 


如上:最重要的出现了,

 

 

else if (wParam < 128) 
            { 
                // ascii char 
                CCIMEDispatcher::sharedDispatcher()->dispatchInsertText((const char *)&wParam, 1); 
            } 
            else 
            { 
                char szUtf8[8] = {0}; 
                int nLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&wParam, 1, szUtf8, sizeof(szUtf8), NULL, NULL); 
                CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(szUtf8, nLen); 
            } 


在这里我们可以依稀看到,中文乱码处理方式:

 

好了,进入我们3.2版本里面:

首先看主注册消息事件开始处:

在GLView::initWithRect中:

    glfwSetMouseButtonCallback(_mainWindow, GLFWEventHandler::onGLFWMouseCallBack);
    glfwSetCursorPosCallback(_mainWindow, GLFWEventHandler::onGLFWMouseMoveCallBack);
    glfwSetScrollCallback(_mainWindow, GLFWEventHandler::onGLFWMouseScrollCallback);
   
glfwSetCharCallback(_mainWindow, GLFWEventHandler::onGLFWCharCallback);
    glfwSetKeyCallback(_mainWindow, GLFWEventHandler::onGLFWKeyCallback);
    glfwSetWindowPosCallback(_mainWindow, GLFWEventHandler::onGLFWWindowPosCallback);
    glfwSetFramebufferSizeCallback(_mainWindow, GLFWEventHandler::onGLFWframebuffersize);
    glfwSetWindowSizeCallback(_mainWindow, GLFWEventHandler::onGLFWWindowSizeFunCallback);

 

上面红色就是我们想要的:

进入GLFWEventHandler::onGLFWCharCallback,在跟进: _view->onGLFWCharCallback(window, character);

 

ok:我们进入最关键地点:直接贴代码:

void GLView::onGLFWCharCallback(GLFWwindow *window, unsigned int character)
{
	IMEDispatcher::sharedDispatcher()->dispatchInsertText((const char*)&character, 1);
}

 

是不是跟2.x 里有相似地方呢?

对,我们就使用2.x 来处理中文乱码问题,废话不多说,直接看结果

void GLView::onGLFWCharCallback(GLFWwindow *window, unsigned int character)
{
	if (character < 128)
		IMEDispatcher::sharedDispatcher()->dispatchInsertText((const char*)&character, 1);
	else
	{
		char szUtf8[8] = { 0 };
		int nLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&character, 1, szUtf8, sizeof(szUtf8), NULL, NULL);
		IMEDispatcher::sharedDispatcher()->dispatchInsertText(szUtf8, nLen);
	}
}


ok,完成!就是这么简单,现在可以试下了,支持中文输入法(主要用于windows平台)

其实就一步:在3.x中收索

GLView::onGLFWCharCallback
然后添加以上函数内容,即搞定。
学习交流!!!紧供参考

获取更多帮主请关注小程序

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值