mirror of https://github.com/axmolengine/axmol.git
Merge pull request #13220 from zilongshanren/testEditBoxWin32
Improved EditBox implement for platform win32
This commit is contained in:
commit
2e9e660cbb
|
@ -39,6 +39,8 @@
|
||||||
|
|
||||||
class CWin32InputBox;
|
class CWin32InputBox;
|
||||||
|
|
||||||
|
typedef void (*Win32InputBoxTextChange)(const char *pText, cocos2d::ui::EditBoxImplWin *ctx);
|
||||||
|
|
||||||
// Structure used to orient the inputbox behavior
|
// Structure used to orient the inputbox behavior
|
||||||
struct WIN32INPUTBOX_PARAM
|
struct WIN32INPUTBOX_PARAM
|
||||||
{
|
{
|
||||||
|
@ -70,6 +72,12 @@ struct WIN32INPUTBOX_PARAM
|
||||||
|
|
||||||
IN DWORD nMaxLength;
|
IN DWORD nMaxLength;
|
||||||
|
|
||||||
|
IN OPTIONAL cocos2d::ui::EditBox::KeyboardReturnType eReturnType;
|
||||||
|
IN OPTIONAL cocos2d::ui::EditBox::InputMode eInputMode;
|
||||||
|
IN OPTIONAL cocos2d::ui::EditBox::InputFlag eInputFlag;
|
||||||
|
IN OPTIONAL Win32InputBoxTextChange lpfnOnTextChange;
|
||||||
|
IN OPTIONAL cocos2d::ui::EditBoxImplWin* lpCtx;
|
||||||
|
|
||||||
// Owner window
|
// Owner window
|
||||||
HWND hwndOwner;
|
HWND hwndOwner;
|
||||||
HINSTANCE hInstance;
|
HINSTANCE hInstance;
|
||||||
|
@ -87,6 +95,7 @@ private:
|
||||||
WIN32INPUTBOX_PARAM *_param;
|
WIN32INPUTBOX_PARAM *_param;
|
||||||
static LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
|
static LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
|
||||||
HWND _hwndEditCtrl;
|
HWND _hwndEditCtrl;
|
||||||
|
int _recursionDepth;
|
||||||
|
|
||||||
void InitDialog();
|
void InitDialog();
|
||||||
void SetParam(WIN32INPUTBOX_PARAM *);
|
void SetParam(WIN32INPUTBOX_PARAM *);
|
||||||
|
@ -103,8 +112,16 @@ public:
|
||||||
LPCSTR szPrompt,
|
LPCSTR szPrompt,
|
||||||
std::string* pstrResult,
|
std::string* pstrResult,
|
||||||
DWORD nMaxLength,
|
DWORD nMaxLength,
|
||||||
bool bMultiLine = false,
|
bool bMultiLine,
|
||||||
HWND hwndParent = 0);
|
HWND hwndParent,
|
||||||
|
cocos2d::ui::EditBox::KeyboardReturnType eReturnType,
|
||||||
|
cocos2d::ui::EditBox::InputMode eInputMode,
|
||||||
|
cocos2d::ui::EditBox::InputFlag eInputFlag,
|
||||||
|
Win32InputBoxTextChange lpfnOnTextChange,
|
||||||
|
cocos2d::ui::EditBoxImplWin *ctx);
|
||||||
|
|
||||||
|
void SetText(const char *pText);
|
||||||
|
void Close();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -174,14 +191,13 @@ static unsigned char definputbox_dlg[] =
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00
|
0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
static LPCTSTR definputbox_buttonnames[] = { _T("OK"), _T("CANCEL") };
|
|
||||||
static const INT_PTR definputbox_buttonids[] = { IDOK, IDCANCEL };
|
|
||||||
|
|
||||||
static const INT
|
static const INT
|
||||||
definputbox_id_prompt = 1000,
|
definputbox_id_prompt = 1000,
|
||||||
definputbox_id_edit1 = 1001,
|
definputbox_id_edit1 = 1001,
|
||||||
definputbox_id_edit2 = 1002;
|
definputbox_id_edit2 = 1002;
|
||||||
|
|
||||||
|
static CWin32InputBox *s_win32InputBox = nullptr;
|
||||||
|
|
||||||
WIN32INPUTBOX_PARAM::WIN32INPUTBOX_PARAM()
|
WIN32INPUTBOX_PARAM::WIN32INPUTBOX_PARAM()
|
||||||
{
|
{
|
||||||
bMultiline = false;
|
bMultiline = false;
|
||||||
|
@ -206,6 +222,8 @@ WIN32INPUTBOX_PARAM::WIN32INPUTBOX_PARAM()
|
||||||
CWin32InputBox::CWin32InputBox(WIN32INPUTBOX_PARAM *param)
|
CWin32InputBox::CWin32InputBox(WIN32INPUTBOX_PARAM *param)
|
||||||
{
|
{
|
||||||
_param = param;
|
_param = param;
|
||||||
|
_hwndEditCtrl = NULL;
|
||||||
|
_recursionDepth = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CWin32InputBox::~CWin32InputBox()
|
CWin32InputBox::~CWin32InputBox()
|
||||||
|
@ -292,9 +310,12 @@ INT_PTR CWin32InputBox::InputBoxEx(WIN32INPUTBOX_PARAM *param)
|
||||||
}
|
}
|
||||||
|
|
||||||
CWin32InputBox inputbox(param);
|
CWin32InputBox inputbox(param);
|
||||||
|
s_win32InputBox = &inputbox;
|
||||||
|
|
||||||
// Resize dialog and SHOW or HIDE multiline
|
// Resize dialog and SHOW or HIDE multiline
|
||||||
INT_PTR r = ::DialogBoxIndirectParam(param->hInstance, dlgTemplate, param->hwndOwner, (DLGPROC)DlgProc, (LPARAM)&inputbox);
|
INT_PTR r = ::DialogBoxIndirectParam(param->hInstance, dlgTemplate, param->hwndOwner, (DLGPROC)DlgProc, (LPARAM)&inputbox);
|
||||||
|
param->hDlg = NULL;
|
||||||
|
s_win32InputBox = nullptr;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -305,7 +326,12 @@ INT_PTR CWin32InputBox::InputBox(
|
||||||
std::string* pstrResult,
|
std::string* pstrResult,
|
||||||
DWORD nResultSize,
|
DWORD nResultSize,
|
||||||
bool bMultiLine,
|
bool bMultiLine,
|
||||||
HWND hwndParent)
|
HWND hwndParent,
|
||||||
|
cocos2d::ui::EditBox::KeyboardReturnType eReturnType,
|
||||||
|
cocos2d::ui::EditBox::InputMode eInputMode,
|
||||||
|
cocos2d::ui::EditBox::InputFlag eInputFlag,
|
||||||
|
Win32InputBoxTextChange lpfnOnTextChange,
|
||||||
|
cocos2d::ui::EditBoxImplWin *ctx)
|
||||||
{
|
{
|
||||||
WIN32INPUTBOX_PARAM param;
|
WIN32INPUTBOX_PARAM param;
|
||||||
|
|
||||||
|
@ -315,14 +341,36 @@ INT_PTR CWin32InputBox::InputBox(
|
||||||
param.nMaxLength = nResultSize;
|
param.nMaxLength = nResultSize;
|
||||||
param.bMultiline = bMultiLine;
|
param.bMultiline = bMultiLine;
|
||||||
param.hwndOwner = hwndParent;
|
param.hwndOwner = hwndParent;
|
||||||
|
param.eReturnType = eReturnType;
|
||||||
|
param.eInputMode = eInputMode;
|
||||||
|
param.eInputFlag = eInputFlag;
|
||||||
|
param.lpfnOnTextChange = lpfnOnTextChange;
|
||||||
|
param.lpCtx = ctx;
|
||||||
return InputBoxEx(¶m);
|
return InputBoxEx(¶m);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWin32InputBox::InitDialog()
|
void CWin32InputBox::InitDialog()
|
||||||
{
|
{
|
||||||
// Set the button captions
|
// Set the button captions, associated with ReturnType
|
||||||
for (size_t i = 0; i<sizeof(definputbox_buttonids) / sizeof(definputbox_buttonids[0]); i++)
|
switch (_param->eReturnType)
|
||||||
::SetDlgItemText(_param->hDlg, (int)definputbox_buttonids[i], definputbox_buttonnames[i]);
|
{
|
||||||
|
case cocos2d::ui::EditBox::KeyboardReturnType::DEFAULT:
|
||||||
|
::SetDlgItemTextW(_param->hDlg, IDOK, L"OK");
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::KeyboardReturnType::DONE:
|
||||||
|
::SetDlgItemTextW(_param->hDlg, IDOK, L"DONE");
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::KeyboardReturnType::SEND:
|
||||||
|
::SetDlgItemTextW(_param->hDlg, IDOK, L"SEND");
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::KeyboardReturnType::SEARCH:
|
||||||
|
::SetDlgItemTextW(_param->hDlg, IDOK, L"SEARCH");
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::KeyboardReturnType::GO:
|
||||||
|
::SetDlgItemTextW(_param->hDlg, IDOK, L"GO");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
::SetDlgItemTextW(_param->hDlg, IDCANCEL, L"CANCEL");
|
||||||
|
|
||||||
// Set other controls
|
// Set other controls
|
||||||
std::u16string utf16Title;
|
std::u16string utf16Title;
|
||||||
|
@ -330,7 +378,7 @@ void CWin32InputBox::InitDialog()
|
||||||
::SetWindowTextW(_param->hDlg, (LPCWSTR) utf16Title.c_str());
|
::SetWindowTextW(_param->hDlg, (LPCWSTR) utf16Title.c_str());
|
||||||
|
|
||||||
std::u16string utf16Prompt;
|
std::u16string utf16Prompt;
|
||||||
cocos2d::StringUtils::UTF8ToUTF16(_param->szTitle, utf16Prompt);
|
cocos2d::StringUtils::UTF8ToUTF16(_param->szPrompt, utf16Prompt);
|
||||||
::SetDlgItemTextW(_param->hDlg, definputbox_id_prompt, (LPCWSTR) utf16Prompt.c_str());
|
::SetDlgItemTextW(_param->hDlg, definputbox_id_prompt, (LPCWSTR) utf16Prompt.c_str());
|
||||||
|
|
||||||
HWND hwndEdit1 = ::GetDlgItem(_param->hDlg, definputbox_id_edit1);
|
HWND hwndEdit1 = ::GetDlgItem(_param->hDlg, definputbox_id_edit1);
|
||||||
|
@ -386,8 +434,68 @@ void CWin32InputBox::InitDialog()
|
||||||
|
|
||||||
::ShowWindow(hwndEdit2, SW_HIDE);
|
::ShowWindow(hwndEdit2, SW_HIDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sets the text limit of the edit control.
|
||||||
|
// wParam is the maximum number of WCHARs the user can enter. For Unicode text, wParam is the number of characters.
|
||||||
|
// Please refer to https://msdn.microsoft.com/en-us/library/bb761607%28v=vs.85%29.aspx
|
||||||
|
if ((int)_param->nMaxLength > 0)
|
||||||
|
{
|
||||||
|
::SendMessageW(hwndEdit1, EM_LIMITTEXT, (WPARAM)_param->nMaxLength, 0);
|
||||||
|
::SendMessageW(hwndEdit2, EM_LIMITTEXT, (WPARAM)_param->nMaxLength, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (_param->eInputFlag)
|
||||||
|
{
|
||||||
|
case cocos2d::ui::EditBox::InputFlag::PASSWORD:
|
||||||
|
// Sets a password character displayed in a edit control when the user types text.
|
||||||
|
// Please refer to https://msdn.microsoft.com/en-us/library/bb761653%28v=vs.85%29.aspx
|
||||||
|
::SendMessageW(hwndEdit1, EM_SETPASSWORDCHAR, (WPARAM)L'*', 0);
|
||||||
|
::SendMessageW(hwndEdit2, EM_SETPASSWORDCHAR, (WPARAM)L'*', 0);
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputFlag::SENSITIVE:
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputFlag::INITIAL_CAPS_WORD:
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputFlag::INITIAL_CAPS_SENTENCE:
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputFlag::INTIAL_CAPS_ALL_CHARACTERS:
|
||||||
|
// Converts all characters to lowercase as they are typed into the edit control.
|
||||||
|
// Please refer to https://msdn.microsoft.com/en-us/library/bb775464%28v=vs.85%29.aspx
|
||||||
|
::SetWindowLongW(hwndEdit1, GWL_STYLE, ::GetWindowLongW(hwndEdit1, GWL_STYLE) | ES_UPPERCASE);
|
||||||
|
::SetWindowLongW(hwndEdit2, GWL_STYLE, ::GetWindowLongW(hwndEdit2, GWL_STYLE) | ES_UPPERCASE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (_param->eInputMode)
|
||||||
|
{
|
||||||
|
case cocos2d::ui::EditBox::InputMode::ANY:
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputMode::EMAIL_ADDRESS:
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputMode::NUMERIC:
|
||||||
|
// Allows only digits to be entered into the edit control.
|
||||||
|
// Note that, even with this set, it is still possible to paste non-digits into the edit control.
|
||||||
|
// Please refer to https://msdn.microsoft.com/en-us/library/bb775464%28v=vs.85%29.aspx
|
||||||
|
::SetWindowLongW(hwndEdit1, GWL_STYLE, ::GetWindowLongW(hwndEdit1, GWL_STYLE) | ES_NUMBER);
|
||||||
|
::SetWindowLongW(hwndEdit2, GWL_STYLE, ::GetWindowLongW(hwndEdit2, GWL_STYLE) | ES_NUMBER);
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputMode::PHONE_NUMBER:
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputMode::URL:
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputMode::DECIMAL:
|
||||||
|
break;
|
||||||
|
case cocos2d::ui::EditBox::InputMode::SINGLE_LINE:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define REDNERING_TIMER_ID 2015
|
||||||
|
|
||||||
// Message handler for about box.
|
// Message handler for about box.
|
||||||
LRESULT CALLBACK CWin32InputBox::DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK CWin32InputBox::DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
@ -403,6 +511,15 @@ LRESULT CALLBACK CWin32InputBox::DlgProc(HWND hDlg, UINT message, WPARAM wParam,
|
||||||
_this = (CWin32InputBox *)lParam;
|
_this = (CWin32InputBox *)lParam;
|
||||||
_this->_param->hDlg = hDlg;
|
_this->_param->hDlg = hDlg;
|
||||||
_this->InitDialog();
|
_this->InitDialog();
|
||||||
|
|
||||||
|
// Set timer for rendering
|
||||||
|
TIMERPROC lpTimerFunc = [](HWND, UINT, UINT, DWORD) {
|
||||||
|
auto director = cocos2d::Director::getInstance();
|
||||||
|
auto glview = director->getOpenGLView();
|
||||||
|
director->mainLoop();
|
||||||
|
glview->pollEvents();
|
||||||
|
};
|
||||||
|
::SetTimer(hDlg, REDNERING_TIMER_ID, USER_TIMER_MINIMUM, lpTimerFunc);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,14 +529,20 @@ LRESULT CALLBACK CWin32InputBox::DlgProc(HWND hDlg, UINT message, WPARAM wParam,
|
||||||
CHAR buf[1024];
|
CHAR buf[1024];
|
||||||
static int i = 0;
|
static int i = 0;
|
||||||
sprintf(buf, "WM_COMMAND: %09d wParam=%08X lParam=%08X\n", i++, wParam, lParam);
|
sprintf(buf, "WM_COMMAND: %09d wParam=%08X lParam=%08X\n", i++, wParam, lParam);
|
||||||
OutputDebugString(buf);
|
OutputDebugStringA(buf);
|
||||||
#endif
|
#endif
|
||||||
INT_PTR buttonId = LOWORD(wParam);
|
INT_PTR buttonId = LOWORD(wParam);
|
||||||
for (size_t i = 0;
|
if (buttonId == IDOK || buttonId == IDCANCEL)
|
||||||
i<sizeof(definputbox_buttonids) / sizeof(definputbox_buttonids[0]);
|
|
||||||
i++)
|
|
||||||
{
|
{
|
||||||
if (buttonId == definputbox_buttonids[i])
|
// Yes! Just close the dialog box simply,
|
||||||
|
// because the text of EditBox has been already synced at the moment of text altered in the edit control
|
||||||
|
::EndDialog(hDlg, buttonId);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// text altered in the edit control
|
||||||
|
// Please refer to https://msdn.microsoft.com/en-us/library/bb761676%28v=vs.85%29.aspx
|
||||||
|
if (HIWORD(wParam) == EN_CHANGE && _this->_recursionDepth == 0 && _this->_param->lpfnOnTextChange != nullptr)
|
||||||
{
|
{
|
||||||
std::u16string wstrResult;
|
std::u16string wstrResult;
|
||||||
std::string utf8Result;
|
std::string utf8Result;
|
||||||
|
@ -434,41 +557,49 @@ LRESULT CALLBACK CWin32InputBox::DlgProc(HWND hDlg, UINT message, WPARAM wParam,
|
||||||
|
|
||||||
bool conversionResult = cocos2d::StringUtils::UTF16ToUTF8(wstrResult, utf8Result);
|
bool conversionResult = cocos2d::StringUtils::UTF16ToUTF8(wstrResult, utf8Result);
|
||||||
_this->_param->pstrResult->clear();
|
_this->_param->pstrResult->clear();
|
||||||
|
++_this->_recursionDepth; // Prevent recursive calls
|
||||||
if (conversionResult)
|
if (conversionResult)
|
||||||
{
|
{
|
||||||
DWORD inputLengthAsUTF8 = (DWORD) cocos2d::StringUtils::getCharacterCountInUTF8String(utf8Result);
|
*(_this->_param->pstrResult) = std::move(utf8Result);
|
||||||
if ((_this->_param->nMaxLength > 0) &&
|
|
||||||
(_this->_param->nMaxLength < inputLengthAsUTF8))
|
|
||||||
{
|
|
||||||
// LengthFilter
|
|
||||||
for (size_t pos=0; pos < _this->_param->nMaxLength; pos++)
|
|
||||||
{
|
|
||||||
std::string utf8Bytes;
|
|
||||||
std::u16string utf16Character(1, wstrResult[pos]);
|
|
||||||
|
|
||||||
bool utf16toutf8ConversionResult = cocos2d::StringUtils::UTF16ToUTF8(utf16Character, utf8Bytes);
|
|
||||||
if (utf16toutf8ConversionResult)
|
|
||||||
{
|
|
||||||
_this->_param->pstrResult->append(utf8Bytes);
|
|
||||||
}
|
}
|
||||||
}
|
// Invoke editBoxTextChanged indirectly
|
||||||
}
|
_this->_param->lpfnOnTextChange(_this->_param->pstrResult->c_str(), _this->_param->lpCtx);
|
||||||
else
|
--_this->_recursionDepth;
|
||||||
{
|
|
||||||
*(_this->_param->pstrResult) = utf8Result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::EndDialog(hDlg, buttonId);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CWin32InputBox::SetText(const char* pText)
|
||||||
|
{
|
||||||
|
if (_hwndEditCtrl != NULL)
|
||||||
|
{
|
||||||
|
std::u16string utf16Text;
|
||||||
|
cocos2d::StringUtils::UTF8ToUTF16(pText, utf16Text);
|
||||||
|
|
||||||
|
// Keep the cursor position
|
||||||
|
// Please refer to :
|
||||||
|
// https://msdn.microsoft.com/en-us/library/bb761598%28v=vs.85%29.aspx
|
||||||
|
// https://msdn.microsoft.com/en-us/library/bb761661%28v=vs.85%29.aspx
|
||||||
|
size_t len = utf16Text.length();
|
||||||
|
DWORD beginPos, endPos;
|
||||||
|
::SendMessageW(_hwndEditCtrl, EM_GETSEL, (WPARAM)&beginPos, (LPARAM)&endPos);
|
||||||
|
::SendMessageW(_hwndEditCtrl, WM_SETTEXT, 0, (LPARAM)utf16Text.c_str());
|
||||||
|
::SendMessageW(_hwndEditCtrl, EM_SETSEL, (WPARAM)std::min<long>(beginPos, len), (LPARAM)std::min<long>(endPos, len));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWin32InputBox::Close()
|
||||||
|
{
|
||||||
|
if (_param->hDlg != NULL)
|
||||||
|
{
|
||||||
|
::EndDialog(_param->hDlg, IDCANCEL);
|
||||||
|
_param->hDlg = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
@ -476,7 +607,7 @@ namespace ui {
|
||||||
|
|
||||||
EditBoxImpl* __createSystemEditBox(EditBox* pEditBox)
|
EditBoxImpl* __createSystemEditBox(EditBox* pEditBox)
|
||||||
{
|
{
|
||||||
return new EditBoxImplWin(pEditBox);
|
return new (std::nothrow) EditBoxImplWin(pEditBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
EditBoxImplWin::EditBoxImplWin(EditBox* pEditText)
|
EditBoxImplWin::EditBoxImplWin(EditBox* pEditText)
|
||||||
|
@ -489,6 +620,7 @@ EditBoxImplWin::EditBoxImplWin(EditBox* pEditText)
|
||||||
, _colText(Color3B::WHITE)
|
, _colText(Color3B::WHITE)
|
||||||
, _colPlaceHolder(Color3B::GRAY)
|
, _colPlaceHolder(Color3B::GRAY)
|
||||||
, _maxLength(-1)
|
, _maxLength(-1)
|
||||||
|
, _isEditing(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -608,38 +740,39 @@ void EditBoxImplWin::setReturnType(EditBox::KeyboardReturnType returnType)
|
||||||
|
|
||||||
bool EditBoxImplWin::isEditing()
|
bool EditBoxImplWin::isEditing()
|
||||||
{
|
{
|
||||||
return false;
|
return _isEditing;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditBoxImplWin::setText(const char* pText)
|
void EditBoxImplWin::setText(const char* pText)
|
||||||
{
|
{
|
||||||
if (pText != nullptr)
|
if (pText != nullptr)
|
||||||
{
|
{
|
||||||
|
if (strcmp(_text.c_str(), pText) == 0) // do nothing if the text is not changed
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_text = pText;
|
_text = pText;
|
||||||
|
if (_isEditing && s_win32InputBox != nullptr) // set text for the running Win32InputBox
|
||||||
|
{
|
||||||
|
s_win32InputBox->SetText(pText);
|
||||||
|
}
|
||||||
|
|
||||||
if (_text.length() > 0)
|
if (_text.length() > 0)
|
||||||
{
|
{
|
||||||
_labelPlaceHolder->setVisible(false);
|
_labelPlaceHolder->setVisible(false);
|
||||||
|
|
||||||
std::string strToShow;
|
|
||||||
|
|
||||||
if (EditBox::InputFlag::PASSWORD == _editBoxInputFlag)
|
if (EditBox::InputFlag::PASSWORD == _editBoxInputFlag)
|
||||||
{
|
{
|
||||||
long length = StringUtils::getCharacterCountInUTF8String(_text);
|
long length = StringUtils::getCharacterCountInUTF8String(_text);
|
||||||
for (long i = 0; i < length; i++)
|
std::string strToShow(length, '*'); // Fills strToShow with length consecutive copies of character '*'
|
||||||
{
|
_label->setString(strToShow);
|
||||||
strToShow.append("*");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strToShow = _text;
|
_label->setString(_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! std::string strWithEllipsis = getStringWithEllipsisJni(strToShow.c_str(), _editSize.width, _editSize.height-12);
|
|
||||||
//! _label->setString(strWithEllipsis.c_str());
|
|
||||||
_label->setString(strToShow.c_str());
|
|
||||||
|
|
||||||
float maxWidth = _editSize.width - 2 * CC_EDIT_BOX_PADDING;
|
float maxWidth = _editSize.width - 2 * CC_EDIT_BOX_PADDING;
|
||||||
auto labelSize = _label->getContentSize();
|
auto labelSize = _label->getContentSize();
|
||||||
if (labelSize.width > maxWidth)
|
if (labelSize.width > maxWidth)
|
||||||
|
@ -671,7 +804,7 @@ void EditBoxImplWin::setPlaceHolder(const char* pText)
|
||||||
_labelPlaceHolder->setVisible(true);
|
_labelPlaceHolder->setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
_labelPlaceHolder->setString(_placeHolder.c_str());
|
_labelPlaceHolder->setString(_placeHolder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -705,9 +838,10 @@ void EditBoxImplWin::openKeyboard()
|
||||||
_delegate->editBoxEditingDidBegin(_editBox);
|
_delegate->editBoxEditingDidBegin(_editBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_isEditing = true;
|
||||||
#if CC_ENABLE_SCRIPT_BINDING
|
#if CC_ENABLE_SCRIPT_BINDING
|
||||||
auto editBox = this->getEditBox();
|
auto editBox = this->getEditBox();
|
||||||
if (editBox && editBox->getScriptEditBoxHandler())
|
if (nullptr != editBox && 0 != editBox->getScriptEditBoxHandler())
|
||||||
{
|
{
|
||||||
CommonScriptData data(editBox->getScriptEditBoxHandler(), "began",editBox);
|
CommonScriptData data(editBox->getScriptEditBoxHandler(), "began",editBox);
|
||||||
ScriptEvent event(kCommonEvent,(void*)&data);
|
ScriptEvent event(kCommonEvent,(void*)&data);
|
||||||
|
@ -720,16 +854,18 @@ void EditBoxImplWin::openKeyboard()
|
||||||
placeHolder = "Enter value";
|
placeHolder = "Enter value";
|
||||||
|
|
||||||
std::string text = getText();
|
std::string text = getText();
|
||||||
|
std::string originalText = text;
|
||||||
auto glView = Director::getInstance()->getOpenGLView();
|
auto glView = Director::getInstance()->getOpenGLView();
|
||||||
HWND hwnd = glView->getWin32Window();
|
HWND hwnd = glView->getWin32Window();
|
||||||
bool didChange = CWin32InputBox::InputBox("Input", placeHolder.c_str(), &text, _maxLength, false, hwnd) == IDOK;
|
bool didChange = CWin32InputBox::InputBox("Input", placeHolder.c_str(), &text, _maxLength, false, hwnd,
|
||||||
|
_keyboardReturnType, _editBoxInputMode, _editBoxInputFlag,
|
||||||
|
&EditBoxImplWin::onWin32InputBoxTextChange, this) == IDOK;
|
||||||
|
_isEditing = false;
|
||||||
|
|
||||||
if (didChange)
|
setText(didChange ? text.c_str() : originalText.c_str());
|
||||||
setText(text.c_str());
|
|
||||||
|
|
||||||
if (_delegate != nullptr)
|
if (_delegate != nullptr)
|
||||||
{
|
{
|
||||||
if (didChange)
|
|
||||||
_delegate->editBoxTextChanged(_editBox, getText());
|
_delegate->editBoxTextChanged(_editBox, getText());
|
||||||
_delegate->editBoxEditingDidEnd(_editBox);
|
_delegate->editBoxEditingDidEnd(_editBox);
|
||||||
_delegate->editBoxReturn(_editBox);
|
_delegate->editBoxReturn(_editBox);
|
||||||
|
@ -740,10 +876,7 @@ void EditBoxImplWin::openKeyboard()
|
||||||
{
|
{
|
||||||
CommonScriptData data(_editBox->getScriptEditBoxHandler(), "changed",_editBox);
|
CommonScriptData data(_editBox->getScriptEditBoxHandler(), "changed",_editBox);
|
||||||
ScriptEvent event(kCommonEvent,(void*)&data);
|
ScriptEvent event(kCommonEvent,(void*)&data);
|
||||||
if (didChange)
|
|
||||||
{
|
|
||||||
ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event);
|
ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event);
|
||||||
}
|
|
||||||
memset(data.eventName,0,sizeof(data.eventName));
|
memset(data.eventName,0,sizeof(data.eventName));
|
||||||
strncpy(data.eventName,"ended",sizeof(data.eventName));
|
strncpy(data.eventName,"ended",sizeof(data.eventName));
|
||||||
event.data = (void*)&data;
|
event.data = (void*)&data;
|
||||||
|
@ -756,9 +889,38 @@ void EditBoxImplWin::openKeyboard()
|
||||||
#endif // #if CC_ENABLE_SCRIPT_BINDING
|
#endif // #if CC_ENABLE_SCRIPT_BINDING
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditBoxImplWin::onWin32InputBoxTextChange(const char *pText, EditBoxImplWin* thiz)
|
||||||
|
{
|
||||||
|
thiz->_isEditing = false; // Prevent recursive calls
|
||||||
|
thiz->setText(pText);
|
||||||
|
thiz->_isEditing = true;
|
||||||
|
|
||||||
|
auto delegate = thiz->getDelegate();
|
||||||
|
if (delegate != nullptr)
|
||||||
|
{
|
||||||
|
delegate->editBoxTextChanged(thiz->_editBox, thiz->_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CC_ENABLE_SCRIPT_BINDING
|
||||||
|
auto editBox = thiz->getEditBox();
|
||||||
|
if (nullptr != editBox && 0 != editBox->getScriptEditBoxHandler())
|
||||||
|
{
|
||||||
|
CommonScriptData data(editBox->getScriptEditBoxHandler(), "changed", editBox);
|
||||||
|
ScriptEvent event(kCommonEvent, (void*)&data);
|
||||||
|
ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event);
|
||||||
|
}
|
||||||
|
#endif // #if CC_ENABLE_SCRIPT_BINDING
|
||||||
|
}
|
||||||
|
|
||||||
void EditBoxImplWin::closeKeyboard()
|
void EditBoxImplWin::closeKeyboard()
|
||||||
{
|
{
|
||||||
|
// close the running Win32InputBox
|
||||||
|
if (s_win32InputBox != nullptr)
|
||||||
|
{
|
||||||
|
s_win32InputBox->Close();
|
||||||
|
s_win32InputBox = nullptr;
|
||||||
|
_isEditing = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditBoxImplWin::onEnter(void)
|
void EditBoxImplWin::onEnter(void)
|
||||||
|
|
|
@ -105,6 +105,8 @@ private:
|
||||||
HWND _sysEdit;
|
HWND _sysEdit;
|
||||||
int _maxTextLength;
|
int _maxTextLength;
|
||||||
*/
|
*/
|
||||||
|
bool _isEditing;
|
||||||
|
static void onWin32InputBoxTextChange(const char *pText, EditBoxImplWin *thiz);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue