標籤:textfieldttf textfield 中文亂碼 輸入框 cocos2dx3.x
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近開發cocos2dx 項目,做一個小遊戲。(個人喜歡用最新版本)</span>
沒系統學習就是問題多多,遇到了很多問題,比如所有的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,完成!就是這麼簡單,現在可以試下了,支援中文IME(主要用於windows平台)
其實就一步:在3.x中收索
GLView::onGLFWCharCallback
然後添加以上函數內容,即搞定。
學習交流!!!緊供參考