#include "Stdafx.h" #include "UIIMENode.h" #include "Application.h" #include "FontAgent.h" #include "ChatManager.h" #include "StageManager.h" HWND cUIIMENode::mHWnd = NULL; bool cUIIMENode::mShiftKey = false; bool cUIIMENode::mControlKey = false; cUIIMENode::cUIIMENode( eUINodeType type ) : cUINode( type ) , mTextLength( 0 ) , mTextCaretX( 0 ) , mScrollIndex( 0 ) , mScrollCaretX( 0 ) , mOneLineWidth( 0 ) , mStartDragCaretX( 0 ) , mEndDragCaretX( 0 ) , mMaxEditLength(0) , mFixFlag( false ) , mCompFlag( false ) , mDraggingFlag( false ) , mChangeText( false ) , mImeFlag( false ) { mEditKind = eEDIT_NORMAL; ::ZeroMemory( mText, sizeof(mText) ); } cUIIMENode::~cUIIMENode() { } void cUIIMENode::Clear() { ::ZeroMemory( mText, sizeof(mText) ); mCompText.Clear(); mTextLength = 0; mTextCaretX = 0; mScrollIndex = 0; mScrollCaretX = 0; mDraggingFlag = false; mCompFlag = false; mChangeText = true; } bool cUIIMENode::OnCreate( cUINodeProperty* ) { if( cUINode::OnCreate() == false ) return false; /// ÇÚµé ÀúÀå if( mHWnd == 0 ) { mHWnd = THEAPP->GetHWND(); } return true; } /// ÁÖÀÇ»çÇ× : 1byte ¹®ÀÚ ³Ö±â void cUIIMENode::OnChar( unsigned int wparam ) { if( mEditKind == eEDIT_NOINPUT ) return; TCHAR str[2] = {0,}; str[0] = (TCHAR)wparam; str[1] = 0; /// ¹®ÀÚ¿­ÀÌ ³ÎÀÌ¸é °æ°í if( *str <= 0 ) { assert( 0 && "str is 0" ); } bool except = false; BYTE byte2 = LOBYTE( wparam ); /// Ư¹®Á¦¿ÜÀΰæ¿ì Á¶°Ç if( mEditKind == eEDIT_EXCEPT_SPECIAL ) { if( (byte2 >= 48 && byte2 <= 57) || (byte2 >= 65 && byte2 <= 90) || (byte2 >= 97 && byte2 <= 122 ) ) except = false; else except = true; } /// ÇØ´ç ¹®ÀÚ¿­ÀÌ À¯È¿ÇÑÁö °Ë»çÈÄ Àüü ÅØ½ºÆ®¿¡ »ðÀÔ if( !except && IsValid( *str ) ) { AddChar( str ); } } /// ÁÖÀÇ»çÇ× : ÀԷ¹ÞÀº ¹®ÀÚ¿­ÀÌ À¯È¿ÇÑÁö °Ë»ç bool cUIIMENode::IsValid( TCHAR c ) { switch( mEditKind ) { case eEDIT_NORMAL: { if( c >= 32 && c < 127 ) return true; } break; case eEDIT_NUMBER: { /// ¼ýÀÚ¿©¾ßÁö¸¸ À¯È¿ if (c >= 0x0030 && c <= 0x0039) return true; } break; case eEDIT_EXCEPT_SPECIAL: { /// Ư¹® Á¦¿Ü // ¼ýÀÚ if (c >= 0x0030 && c <= 0x0039) return true; // ¿µ¹® else if ( (c >= 0x0041 && c <= 0x005A) || (c >= 0x0061 && c <= 0x007A) ) return true; // ÇÑ±Û // else if (c >= 0XAC00 && c <= 0XD7A3) // return true; // ÀϾî-HIRAGANA else if (c >= 0X3040 && c <= 0X309F) return true; // ÀϾî-KATAKANA else if (c >= 0X30A0 && c <= 0X30FF) return true; // CJK Unified Ideographs (ÇÑÁßÀÏÅëÇÕ) else if (c >= 0X4E00 && c <= 0X9FCF) return true; } break; case eEDIT_ACCOUNT_ID: case eEDIT_ACCOUNT_PASS: { // ¼ýÀÚ if (c >= 0x0030 && c <= 0x0039) return true; // ¿µ¹® else if ( (c >= 0x0041 && c <= 0x005A) || (c >= 0x0061 && c <= 0x007A) ) return true; } break; } return false; } void cUIIMENode::SetFocus() { cUINode::SetFocus(); //// HIMC hIMC = ::ImmGetContext( mHWnd ); DWORD dwConversion, dwSentence; ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence); /// °èÁ¤¿ëÀÌ¸é ¿µ¹®À¸·Î º¯È¯ if( mEditKind == eEDIT_ACCOUNT_ID || mEditKind == eEDIT_ACCOUNT_PASS ) { if( dwConversion == IME_CMODE_HANGEUL ) ::ImmSetConversionStatus( hIMC, IME_CMODE_ALPHANUMERIC, 0 ); } // else // { /// Çѱ۸ðµåÀ̸é IME ¹öÆÛ Ŭ¸®¾î // if( dwConversion == IME_CMODE_HANGEUL ) // ::ImmSetCompositionString( hIMC, SCS_SETSTR, NULL, 0, NULL, 0 ); // } ::ImmNotifyIME( hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0 ); ::ImmReleaseContext( mHWnd, hIMC ); } void cUIIMENode::OnImeNotify( unsigned int /*wparam*/ ) { HIMC hIMC = ::ImmGetContext( mHWnd ); DWORD dwConversion, dwSentence; ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence); /// °èÁ¤¿ëÀÌ¸é ¿µ¹®À¸·Î º¯È¯ if( mEditKind == eEDIT_ACCOUNT_ID || mEditKind == eEDIT_ACCOUNT_PASS ) { if( dwConversion == IME_CMODE_HANGEUL ) ::ImmSetConversionStatus( hIMC, IME_CMODE_ALPHANUMERIC, 0 ); } ::ImmReleaseContext( mHWnd, hIMC ); } /// ÁÖÀÇ»çÇ× : void cUIIMENode::OnImeComposition( unsigned int, unsigned int lparam ) { /// ¼ýÀÚ¿ë ¿¡µðÆ®À̰ųª, ¹®ÀÚ¸¦ ¸ø¹Þ°Ô ÇÏ¸é ¸®ÅÏ if( mEditKind == eEDIT_NOINPUT || mEditKind == eEDIT_NUMBER || mEditKind == eEDIT_ACCOUNT_ID || mEditKind == eEDIT_ACCOUNT_PASS ) return; /// µå·¡±× »óÅÂÀ̸é ime ÀÔ·Â ¾È¹ÞÀ½ if( mPressed == true ) { mImeFlag = true; return; } /// Á¶ÇÕ°ªÀÌ ¿Ï¼ºµÇ¼­ µé¾î¿Â°æ¿ì ¸®ÅÏ ( µå·¡±×»óÅ¿¡¼­ ÀԷµǾú´ø ³»¿ëµé ) if( mImeFlag == true ) { mImeFlag = false; return; } HIMC hIMC = ::ImmGetContext( mHWnd ); TCHAR str[512] = {0,}; /// Á¶ÇÕÁßÀÎ ¹®ÀÚ¿­À» ¾ò¾î¿Â´Ù if( lparam & GCS_COMPSTR ) { /// ±æÀ̸¦ ¾ò¾î¿Â´Ù int strLen = ::ImmGetCompositionString( hIMC, GCS_COMPSTR, NULL, 0 ); /// ¾ò¾î¿Â ±æÀ̸¸Å­ÀÇ ¹®ÀÚ¸¦ ¾ò´Â´Ù ::ImmGetCompositionString( hIMC, GCS_COMPSTR, str, strLen ); /// ¹®ÀÚ¿­ ³¡ int tlen = ::_tcslen( str ); str[tlen] = 0; AddCompWord( str, tlen ); } /// ¿Ï¼ºµÈ ¹®ÀÚ¿­À» ¾ò¾î¿Â´Ù if( lparam & GCS_RESULTSTR ) { /// ±æÀ̸¦ ¾ò¾î¿Â´Ù int strLen = ::ImmGetCompositionString( hIMC, GCS_RESULTSTR, NULL, 0 ); ::ImmGetCompositionString( hIMC, GCS_RESULTSTR, str, strLen ); int tlen = ::_tcslen( str ); str[tlen] = 0; AddString( str, tlen ); } ::ImmReleaseContext( mHWnd, hIMC ); } void cUIIMENode::OnImeEndComposition( unsigned int /*wparam*/, unsigned int /*lparam*/ ) { mCompText.Clear(); mCompFlag = false; mChangeText = true; } /// ÁÖÀÇ»çÇ× : void cUIIMENode::OnKeyDown( eKeyCode code ) { switch( code ) { case eKEY_C: { /// ÄÁÆ®·Ñ۸¦ µ¿½Ã¿¡ ´©¸£¸é, if( mControlKey ) { KeyDownCopy(); } } break; case eKEY_V: { if( mControlKey ) { KeyDownPaste(); } } break; case eKEY_TAB: { /// °ÔÀÓ½ºÅ×ÀÌÁö°¡ ¾Æ´Ï¸é ¸®ÅÏ if( STAGEMAN->GetCurrentStage() != eStage_Game ) return; if( mShiftKey ) { /// shfit + tab Ű½Ã Æ÷Ä¿½º üÀÎÁö CHATMANAGER->ChangeFocus(); } } break; case eKEY_LEFT: { CaretMoveLeft(); } break; case eKEY_RIGHT: { CaretMoveRight(); } break; case eKEY_HOME: { mDraggingFlag = false; CaretMoveHome(); } break; case eKEY_END: { mDraggingFlag = false; CaretMoveEnd(); } break; case eKEY_BACK: { /// ¼±Åÿµ¿ªÀÌ ÀÖÀ¸¸é, if( mDraggingFlag ) { DeleteSell(); } else { KeyDownBackSpace(); } } break; case eKEY_DELETE: { /// ¼±Åÿµ¿ªÀÌ ÀÖÀ¸¸é, if( mDraggingFlag ) { DeleteSell(); } else { KeyDownDelete(); } } break; default: break; } } ////------------------------------------------------------------------------ /// ÁÖÀÇ»çÇ× : 1byte ¹®ÀÚ »ðÀÔ /// UNICODE ¹öÀüÀ̹ǷΠÇѱÛÀ̵ç, ¿µ¾îµç ¸ðµÎ ÇѱÛÀÚÀÇ ±æÀÌ´Â 1 ÀÌ´Ù. void cUIIMENode::AddChar( LPTSTR word ) { /// µå·¡±× »óÅÂÀ̸é ime ÀÔ·Â ¾È¹ÞÀ½ if( mPressed == true ) return; mCompFlag = false; mFixFlag = false; /// ¼±Åÿµ¿ª ÇØÁ¦ DeleteSell(); /// ÀÔ·Â Á¦ÇÑ if( mTextLength >= mMaxEditLength ) return; TCHAR rightStr[ MAX_TEXT_LENGTH ] = {0,}; int rightLen = GetRightString( rightStr, MAX_TEXT_LENGTH ); /// »ðÀÔ mText[ mTextCaretX ] = *( word ); /// ij·µÀ妽º, ±æÀÌ °»½Å mTextCaretX++; mTextLength++; assert( mTextCaretX < MAX_TEXT_LENGTH ); /// ¹®ÀÚ¿­ Áß°£¿¡ »ðÀÔÀ̾ú´Ù¸é, ¿À¸¥ÂÊ ¹®ÀÚ¿­À» »ðÀÔÇÑ´Ù if( rightLen != 0 ) { Sstrncpy( mText + mTextCaretX, MAX_TEXT_LENGTH - mTextCaretX, rightStr, rightLen ); } mText[ mTextLength ] = 0; /// ÅØ½ºÆ® width ±¸Çϱâ unsigned int textWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_Chat, mText + mScrollIndex, mTextCaretX - mScrollIndex ); /// Á¦ÇÑÆøº¸´Ù ±æ¸é ½ºÅ©·Ñ ½ÃÅ´ if( (int)textWidth > mOneLineWidth ) { mScrollIndex++; } else { mScrollCaretX++; } mChangeText = true; } /// ÁÖÀÇ»çÇ× : void cUIIMENode::AddCompWord( LPTSTR word, int len ) { /// ¼±Åÿµ¿ª ÇØÁ¦ DeleteSell(); if( mTextLength >= mMaxEditLength ) return; /// Á¶¸³ÁßÀÎ ÇѱÛÀ» ÀúÀå mCompText.Clear(); mCompText.Append( word, len ); /// Á¶¸³ÁßÀÎÁö ¾Æ´ÑÁö¸¦ ±æÀÌ·Î ÆÇ´Ü if( len > 0 ) { /// ù Á¶¸³Àΰæ¿ì¸¸ ó¸® if( mCompFlag == false ) { int textWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_Chat, mText + mScrollIndex, mTextCaretX - mScrollIndex ); int comWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_Chat, (LPCTSTR)mCompText.Cstr(), mCompText.GetLength() ); /// Á¦ÇÑÆøº¸´Ù ±æ¸é ½ºÅ©·Ñ ½ÃÅ´ if( textWidth + comWidth > mOneLineWidth ) { mScrollIndex++; mScrollCaretX--; } } /// Á¶ÇÕÁßÀÓ. mCompFlag = true; } else if( len <= 0 ) { /// Á¶ÇÕÀÌ ³¡³² mCompFlag = false; } mChangeText = true; } /// ÁÖÀÇ»çÇ× : ÇÑ ¹®ÀÚ¿­¿¡ Ư¼ö¹®ÀÚ, °ø¹é µîÀ» ó¸®Çϱâ À§ÇÔ void cUIIMENode::AddString( LPTSTR string, int len ) { LPTSTR str = string; for(int index = 0; index < len; ++index ) { if( mEditKind == eEDIT_EXCEPT_SPECIAL ) { /// Ư¹®Á¦¿Ü¿ë Àϰæ¿ì Á¶°Ç. if( IsValid(*str) == true ) { AddChar( str ); str++; } /* if( (*str >= 48 && *str <= 57) || (*str >= 65 && *str <= 90) || (*str >= 97 && *str <= 122 ) || (*str >= 12593 && *str <= 12642 ) || (*str >= 44032 && *str <= 55203 )) { AddChar( str ); str++; } */ } else { /// ÀϹÝÀûÀÎ °æ¿ì. AddChar( str ); str++; } } mCompText.Clear(); mCompFlag = false; mChangeText = true; } /// ÁÖÀÇ»çÇ× : ij·µÀ» Áß½ÉÀ¸·Î ¿À¸¥ÂÊ ¹®ÀÚ¿­À» ¾ò´Â´Ù int cUIIMENode::GetRightString( LPTSTR dest, unsigned int maxDestLen ) { /// ¹®ÀÚ¿­ÀÇ ³¡ÀÌ¸é ¸®ÅÏ if( mTextCaretX >= mTextLength ) return 0; /// ÇöÀç Ä¿¼­·ÎºÎÅÍ ¿À¸¥ÂÊ ¹®ÀÚ¿­ °¡Á®´Ù°¡ dest¿¡ º¹»ç Sstrncpy( dest, maxDestLen, mText + mTextCaretX, mTextLength - mTextCaretX ); /// Àß¶ó³½ ¿À¸¥ÂÊ ¹®ÀÚ¿­ ±æÀÌ ¸®ÅÏ return (mTextLength - mTextCaretX); } /// ÁÖÀÇ»çÇ× : ij·µÀ» ¹®ÀÚ¿­ óÀ½À¸·Î À̵¿ void cUIIMENode::CaretMoveHome() { mCompFlag = false; /// ÀÌ¹Ì ½ÃÀÛÀ§Ä¡¿¡ ÀÖÀ¸¸é ¸®ÅÏ if( mTextCaretX <= 0 ) return; mTextCaretX = 0; mScrollCaretX = 0; mScrollIndex = 0; mChangeText = true; } /// ÁÖÀÇ»çÇ× : ij·µÀ» ¹®ÀÚ¿­ ³¡À¸·Î À̵¿ void cUIIMENode::CaretMoveEnd() { mCompFlag = false; /// ÀÌ¹Ì ³¡ À§Ä¡¿¡ ÀÖÀ¸¸é ¸®ÅÏ if( mTextCaretX == mTextLength ) return; mTextCaretX = mTextLength; /// À߸° Æø unsigned int cutWidth = 0; /// À߸°¹®ÀÚ¿­ÀÇ ±æÀÌ int cutlen = 0; /// ±æÀÌ °Ë»ç while( (int)cutWidth < mOneLineWidth ) { /// °è¼Ó °Ë»çÇÒÇÊ¿ä ¾øÀ½. if( cutlen > mTextLength ) break; cutlen++; cutWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_Chat, mText + mTextLength - cutlen, cutlen ); } /// ¹®ÀÚ Æø º¸Á¤ ( Æøº¸´Ù Æ¢¾î°¡³ª°¡´Â ±ÛÀÚ´Â ´ÙÀ½¹ø¿¡ Âïµµ·Ï ¹Ì·é´Ù ) if( (int)cutWidth > mOneLineWidth ) { cutlen--; } /// ½ºÅ©·ÑµÈ »óŶó¸é if( mTextLength - cutlen > 0 ) { mScrollIndex = mTextLength - cutlen; mScrollCaretX = cutlen; } else { mScrollIndex = 0; mScrollCaretX = mTextLength; } mChangeText = true; } /// ÁÖÀÇ»çÇ× : ij·µÀ» ÇÑ ÀÚ ¿ÞÂÊÀ¸·Î À̵¿ void cUIIMENode::CaretMoveLeft() { mCompFlag = false; /// µå·¡±×ÁßÀÎ ¿µ¿ªÀÌ ÀÖÀ¸¸é, if( mDraggingFlag ) { /// µå·¡±ë ¿µ¿ª óÀ½À¸·Î À̵¿ if( mStartDragCaretX < mEndDragCaretX ) { mTextCaretX = mScrollIndex + mStartDragCaretX; mScrollCaretX = mStartDragCaretX; } else { mTextCaretX = mScrollIndex + mEndDragCaretX; mScrollCaretX = mEndDragCaretX; } mDraggingFlag = false; return; } /// ÀÌ¹Ì ½ÃÀÛÀ§Ä¡¿¡ ÀÖÀ¸¸é ¸®ÅÏ if( mTextCaretX <= 0 ) return; /// mTextCaretX--; /// ½ºÅ©·Ñij·µ À§Ä¡°¡ showtextÀÇ Ã¹ À§Ä¡°¡ ¾Æ´Ï¸é ±×³É °¨¼Ò if( mScrollCaretX - 1 >= 0 ) { mScrollCaretX--; } else { /// ¾ÕÀÇ ¹®ÀåÀ» ¹Ý¸¸ ‹¯°Üº¸¿©ÁÖ´Â ¼Ò½º /// °Ë»çµÈ ¹®ÀÚ¿­ Æø unsigned int cutWidth = 0; /// À߸°¹®ÀÚ¿­ÀÇ ±æÀÌ int cutlen = 0; /// ±æÀÌ °Ë»ç while( (int)cutWidth < mOneLineWidth ) { cutlen++; cutWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_Chat, mText + mScrollIndex, cutlen ); } int div = cutlen / 2; int n = mScrollIndex / div; if( n > 0 ) { mScrollIndex -= div; } else { /// ³²Àº ³»¿ëÀ» ¸ðµÎ ¶¯±ä´Ù int value = mScrollIndex % div; mScrollIndex -= value; } mScrollCaretX = mTextCaretX - mScrollIndex; mChangeText = true; } } /// ÁÖÀÇ»çÇ× : ij·µÀ» ÇÑ ÀÚ ¿À¸¥ÂÊÀ¸·Î À̵¿ void cUIIMENode::CaretMoveRight() { mCompFlag = false; /// µå·¡±×ÁßÀÎ ¿µ¿ªÀÌ ÀÖÀ¸¸é, if( mDraggingFlag ) { /// µå·¡±ë ¿µ¿ª óÀ½À¸·Î À̵¿ if( mStartDragCaretX < mEndDragCaretX ) { mTextCaretX = mScrollIndex + mEndDragCaretX; mScrollCaretX = mEndDragCaretX; } else { mTextCaretX = mScrollIndex + mStartDragCaretX; mScrollCaretX = mStartDragCaretX; } mDraggingFlag = false; return; } /// ÀÌ¹Ì ³¡ À§Ä¡¿¡ ÀÖÀ¸¸é ¸®ÅÏ if( mTextCaretX == mTextLength ) return; /// ¿À¸¥¦UÀ¸·Î ÇÑÄ­ Áõ°¡ mTextCaretX++; unsigned int textWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_Chat, mText + mScrollIndex, mTextCaretX - mScrollIndex ); /// ½ºÅ©·Ñij·µ À§Ä¡°¡ ÇѶóÀÎÀÇ ³¡ÀÌ ¾Æ´Ï¸é Áõ°¡ if( (int)textWidth < mOneLineWidth ) { mScrollCaretX++; } else { /// °Ë»çµÈ ¹®ÀÚ¿­ Æø unsigned int cutWidth = 0; /// À߸°¹®ÀÚ¿­ÀÇ ±æÀÌ int cutlen = 0; /// ±æÀÌ °Ë»ç while( (int)cutWidth < mOneLineWidth ) { /// °è¼Ó °Ë»çÇÒÇÊ¿ä ¾øÀ½. if( cutlen >= mTextLength ) break; cutlen++; cutWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_Chat, mText + mScrollIndex, cutlen ); } /// ¹®ÀÚ¿­ ¶¯±â±â int div = cutlen / 2; int n = (mTextLength - (mScrollIndex + cutlen) ) / div; if( n > 0 ) { mScrollIndex += div; } else { /// ³²Àº ³»¿ëÀ» ¸ðµÎ ¶¯±ä´Ù int value = (mTextLength - (mScrollIndex + cutlen)) % div + 1; mScrollIndex += value; } mScrollCaretX = mTextCaretX - mScrollIndex; mChangeText = true; } } /// ÁÖÀÇ»çÇ× : ¹é½ºÆäÀ̽º¸¦ ´­·ÈÀ»¶§ÀÇ Ã³¸® void cUIIMENode::KeyDownBackSpace() { if( mPressed == true ) return; mCompFlag = false; if( mTextCaretX <= 0 ) return; /// »èÁ¦½Ã ij·µÁß½ÉÀ¸·Î ¿À¸¥ÂÊ ¹®ÀÚ¿­ÀÌ Àִ°æ¿ì ÀúÀå. TCHAR rightStr[ MAX_TEXT_LENGTH ] = {0,}; int rightLen = GetRightString( rightStr, MAX_TEXT_LENGTH ); if( mTextCaretX > 0 ) { mTextCaretX--; } else { assert(0); } if( mTextLength > 0 ) { mTextLength--; } else { assert(0); } /// ½ºÅ©·Ñij·µ À§Ä¡°¡ showtextÀÇ Ã¹ À§Ä¡°¡ ¾Æ´Ï¸é ±×³É °¨¼Ò if( mScrollCaretX - 1 >= 0 ) { mScrollCaretX--; } else { /* À̺κР´Ù½ÃÂ¥±â-_- °¡³ª´Ù¶ó¸¶¹Ù»ç¾Æ */ /// ¾ÕÀÇ ¹®ÀåÀ» ¹Ý¸¸ ‹¯°Üº¸¿©ÁÖ´Â ¼Ò½º /// °Ë»çµÈ ¹®ÀÚ¿­ Æø unsigned int cutWidth = 0; /// À߸°¹®ÀÚ¿­ÀÇ ±æÀÌ int cutlen = 0; /// ±æÀÌ °Ë»ç while( (int)cutWidth < mOneLineWidth ) { cutlen++; cutWidth = FONTAGENT->GetTextExtent( cFontAgent::eFont_Chat, mText + mScrollIndex, cutlen ); } int div = cutlen / 2; int n = mScrollIndex / div; if( n > 0 ) { mScrollIndex -= div; } else { /// ³²Àº ³»¿ëÀ» ¸ðµÎ ¶¯±ä´Ù int value = mScrollIndex % div; mScrollIndex -= value; } mScrollCaretX = mTextCaretX - mScrollIndex; } /// ¹®ÀÚ¿­ ³¡¿¡ ¾²·¹±â °ªÀÌ ¾øµµ·Ï û¼Ò ClearText( mTextCaretX ); mText[ mTextCaretX ] = 0; /// ¿À¸¥ÂÊ ¹®ÀÚ¿­ÀÌ Á¸ÀçÇϸé if( rightLen != 0 ) { /// ¹®ÀÚ¿­ ³¡¿¡ ¾²·¹±â °ªÀÌ ¾øµµ·Ï û¼Ò ClearText( mTextCaretX ); Sstrncpy( mText + mTextCaretX, MAX_TEXT_LENGTH - mTextCaretX, rightStr, rightLen ); } mChangeText = true; } /// ÁÖÀÇ»çÇ× : delete ۸¦ ´­·¶À»¶§ÀÇ Ã³¸® void cUIIMENode::KeyDownDelete() { if( mPressed == true ) return; mCompFlag = false; /// ÀÌ¹Ì ³¡ À§Ä¡¿¡ ÀÖÀ¸¸é ¸®ÅÏ if( mTextCaretX == mTextLength ) return; /// »èÁ¦½Ã ij·µÁß½ÉÀ¸·Î ¿À¸¥ÂÊ ¹®ÀÚ¿­ÀÌ Àִ°æ¿ì ÀúÀå. TCHAR rightStr[ MAX_TEXT_LENGTH ] = {0,}; int rightLen = GetRightString( rightStr, MAX_TEXT_LENGTH ); // ¸¸¾à ¼±Åÿµ¿ªÀ» Áö¿ï°æ¿ì¿¡´Â ´Ù¸¥ °ªÀ» ³Öµµ·Ï ÇÑ´Ù. if( mTextLength > 0 ) { mTextLength--; } else { assert(0); } if( rightLen != 0 ) { /// ¹®ÀÚ¿­ ³¡¿¡ ¾²·¹±â °ªÀÌ ¾øµµ·Ï û¼Ò ClearText( mTextCaretX ); Sstrncpy( mText + mTextCaretX, MAX_TEXT_LENGTH - mTextCaretX, rightStr + 1, rightLen - 1 ); } /// ¹®ÀÚ¿­ ³¡¿¡ ¾²·¹±â °ªÀÌ ¾øµµ·Ï û¼Ò ClearText( mTextLength ); mText[ MAX_TEXT_LENGTH ] = 0; mChangeText = true; } /// ÁÖÀÇ»çÇ× : mText¿¡¼­ ¾²Áö ¾Ê´Â À妽º¸¦ Áö¿ö¹ö¸°´Ù void cUIIMENode::ClearText( int index ) { /// copy size °ËÁõ ÇÊ¿ä!! TCHAR str[ MAX_TEXT_LENGTH ] = {0,}; Sstrncpy( str, MAX_TEXT_LENGTH, mText, index ); ::ZeroMemory( mText, sizeof(mText) ); Sstrncpy( mText, MAX_TEXT_LENGTH, str, index ); mChangeText = true; } /// ÁÖÀÇ»çÇ× : void cUIIMENode::KeyDownCopy() { /// ¿øº» LPTSTR str = mText; /// º¹»ç ÀúÀå ¹®ÀÚ¿­ TCHAR copyStr[ MAX_TEXT_LENGTH ] = {0,}; /// º¹»çÇØµÑ ¹®ÀÚ¿­ ±æÀÌ int copyLen = mEndDragCaretX - mStartDragCaretX; if( copyLen == 0 ) return; if( copyLen > 0 ) { Sstrncpy( copyStr, MAX_TEXT_LENGTH, str + mStartDragCaretX + mScrollIndex, copyLen ); } else if( copyLen < 0 ) { /// ¾ç¼öº¯È¯ copyLen = (-copyLen); Sstrncpy( copyStr, MAX_TEXT_LENGTH, str + mEndDragCaretX + mScrollIndex, copyLen ); } /// ¸ÖƼ¹ÙÀÌÆ®·Î º¯È¯ char asciiStr[ MAX_TEXT_LENGTH ] = {0,}; ConvertToAscii( copyStr, asciiStr, MAX_TEXT_LENGTH ); int asciilen = ::strlen( asciiStr ); /// Ŭ¸³º¸µå¿¡ ºÙ¿©³Ö±â HGLOBAL hMem; /// Àü¿ª ¸Þ¸ð¸® ÇÒ´ç hMem = ::GlobalAlloc( GHND, (asciilen + 1) ); /// ¸Þ¸ð¸® »ç¿ë Çã°¡±Ç ¾ò±â char* pBuff = (char*)::GlobalLock( hMem ); /// Ŭ¸³º¸µå¿¡ º¹»ç memcpy( pBuff, asciiStr, asciilen ); pBuff[ asciilen ] = 0; /// ¸Þ¸ð¸® Çã°¡ ÇØÁ¦ ::GlobalUnlock( hMem ); /// Ŭ¸³º¸µå »ç¿ë °¡´ÉÇÏ´Ù¸é, »ðÀÔ if( OpenClipboard( mHWnd ) ) { /// ±âÁ¸ÀÇ µ¥ÀÌÅ͸¦ Áö¿î´Ù ::EmptyClipboard(); /// »ðÀÔ ::SetClipboardData( CF_TEXT, hMem ); ::CloseClipboard(); } } /// ÁÖÀÇ»çÇ× : void cUIIMENode::KeyDownPaste() { if( mPressed == true ) return; /// ºÙ¿©³Ö±â ÇÒ¶§ ¼±Åÿµ¿ªÀÌ ÀÖÀ¸¸é ¸ÕÀú Áö¿î´Ù DeleteSell(); /// Ŭ¸³º¸µå¿¡ ºÙ¿©³Ö±â HGLOBAL hMem; /// Ŭ¸³º¸µå¿¡ TEXT ŸÀÔÀÇ ¹®ÀÚ°¡ ÀÖÀ¸¸é, °¡Á®¿Â´Ù if( ::IsClipboardFormatAvailable( CF_UNICODETEXT ) ) { /// ¿­¸®Áö ¾ÊÀ¸¸é ¸®ÅÏ if( ::OpenClipboard( mHWnd ) == false ) return; hMem = ::GetClipboardData( CF_UNICODETEXT ); /// ¸Þ¸ð¸® ¶ô wchar_t* pBuff = (wchar_t*)::GlobalLock( hMem ); int plen = ::wcslen(pBuff); if( plen == 0 ) { ::GlobalUnlock( hMem ); ::CloseClipboard(); return; } /// µ¥ÀÌÅÍ ÀúÀå if( plen - MAX_TEXT_LENGTH > 0 ) { memset( pBuff + MAX_TEXT_LENGTH - 1, 0, plen - MAX_TEXT_LENGTH ); plen = ::wcslen(pBuff); } LPTSTR s = pBuff; for(int index = 0; index < plen; ++index ) { // ÅÇ Á¦°Å if( !(*s >= 0x0000 && *s <= 0x001f) ) { AddChar( s ); } s++; } /// ÇØÁ¦ ::GlobalUnlock( hMem ); /// ´Ý±â ::CloseClipboard(); mChangeText = true; } } /// ÁÖÀÇ»çÇ× : ¿µ¿ªÀÌ ¼±ÅÃµÈ »óÅ¿¡¼­ backspace ÀԷ ȤÀº delete ÀÔ·Â void cUIIMENode::DeleteSell() { if( mPressed == true ) return; /// ÀÌ¹Ì ¼±Åÿµ¿ªÀÌ ¾øÀ¸¸é ¸®ÅÏ if( mDraggingFlag == false ) return; /// ¼±Åà ¿µ¿ª ÇØÁ¦ mDraggingFlag = false; int delstart = 0; int len = mEndDragCaretX - mStartDragCaretX; if( len == 0 ) return; if( len < 0 ) { len = (-len); delstart = len; mTextCaretX = mEndDragCaretX + mScrollIndex; } else if( len > 0 ) { mTextCaretX = ( mStartDragCaretX > 0 ) ? mStartDragCaretX + mScrollIndex : mStartDragCaretX; } /// »èÁ¦½Ã ij·µÁß½ÉÀ¸·Î ¿À¸¥ÂÊ ¹®ÀÚ¿­ÀÌ Àִ°æ¿ì ÀúÀå. TCHAR rightStr[ MAX_TEXT_LENGTH ] = {0,}; int rightLen = GetRightString( rightStr, MAX_TEXT_LENGTH ); /// »ì¾Æ ÀÖ´Â ÅØ½ºÆ® »èÁ¦ ( ¼±Åà ¿µ¿ª ºÎºÐ¸¸ È®½ÇÈ÷ »èÁ¦ ) for( int i = mTextCaretX; i < mTextCaretX + delstart + len; ++i ) { mText[i] = _T('\0'); } if( rightLen != 0 ) { Sstrncpy( mText + mTextCaretX, MAX_TEXT_LENGTH - mTextCaretX, rightStr + len, rightLen - len ); } if( mTextCaretX == 0 ) mScrollIndex = 0; mScrollCaretX = mTextCaretX - mScrollIndex; if( mTextLength - len >= 0 ) { mTextLength -= len; } else { assert(0); } mText[ mTextLength ] = 0; len = 0; mChangeText = true; }