cocos2dx 3.2 解決輸入框(TextField,TextFieldTTF) 中文亂碼問題,cocos2dxtextfield
最近開發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,完成!就是這麼簡單,現在可以試下了,支援中文IME(主要用於windows平台)
其實就一步:在3.x中收索GLView::onGLFWCharCallback
然後添加以上函數內容,即搞定。
學習交流!!!緊供參考
struts標籤中的textfield怎在輸入框後邊加文字?
你是想用struts 2.X 內建滴那個證吧,那個東東,可以把你的一些錯誤提示放在那個標籤後面,你可以參考一下那個struts 架構開發那本書。裡面有很詳細的說明
textfield() 為何()裡帶參數 就是textfield(30) 這個30是什?
30是文本的寬度 , 就是說這個textfield的寬度可以顯示30個字元