zoukankan      html  css  js  c++  java
  • cocos2dx 3.2 解决输入框(TextField,TextFieldTTF) 中文乱码问题

    近期开发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("
    ", 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
    然后加入以上函数内容,即搞定。
    学习交流!!!紧供參考


  • 相关阅读:
    【SVN解决代码提交冲突】https://www.cnblogs.com/aaronLinux/p/5521844.html
    查询有2门及以上不及格科目的学生姓名及其平均成绩
    【Python】split
    【Python】文件处理
    【robotframework】打开浏览器提示:NoSuchWindowException: Message: Unable to get browser
    定位到新窗口
    8月1号
    【定位】https://blog.csdn.net/cyjs1988/article/details/76284289
    【Robotframework】脚本跑完后自动发送邮件
    jQuery Mobile Data 属性
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/3988118.html
Copyright © 2011-2022 走看看