Merge pull request #13220 from zilongshanren/testEditBoxWin32

Improved EditBox implement for platform win32
This commit is contained in:
子龙山人 2015-09-01 10:40:11 +08:00
commit 2e9e660cbb
2 changed files with 229 additions and 65 deletions

View File

@ -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(&param); return InputBoxEx(&param);
} }
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)

View File

@ -105,6 +105,8 @@ private:
HWND _sysEdit; HWND _sysEdit;
int _maxTextLength; int _maxTextLength;
*/ */
bool _isEditing;
static void onWin32InputBoxTextChange(const char *pText, EditBoxImplWin *thiz);
}; };