一 普遍字符输入
case
WM_CHAR:
WCHAR szCharW;
CHAR szChar = (CHAR)LOWORD(wParam);
if (szChar >= 32 && szChar <= 128 )
{
::MultiByteToWideChar(CP_ACP, 0 , (LPCSTR) & szChar, 1 , & szCharW, 1 );
// AxTrace(0, 1, "Char:%02X", szCharW);
CEGUI::System::getSingleton().injectChar((CEGUI::utf32)szCharW);
}
WCHAR szCharW;
CHAR szChar = (CHAR)LOWORD(wParam);
if (szChar >= 32 && szChar <= 128 )
{
::MultiByteToWideChar(CP_ACP, 0 , (LPCSTR) & szChar, 1 , & szCharW, 1 );
// AxTrace(0, 1, "Char:%02X", szCharW);
CEGUI::System::getSingleton().injectChar((CEGUI::utf32)szCharW);
}
二 中文输入
case
WM_IME_COMPOSITION:
OutputDebugStringW( L " WM_IME_COMPOSITION\n " );
{
LONG lRet; // Returned count in CHARACTERS
WCHAR wszCompStr[MAX_COMPSTRING_SIZE];
bool bRet = false ;
// *trapped = true;
if ( NULL == ( hImc = _ImmGetContext( GetHWND() ) ) )
{
break ;
}
if ( lParam & GCS_RESULTSTR )
{
OutputDebugStringW( L " GCS_RESULTSTR\n " );
lRet = _ImmGetCompositionStringW( hImc, GCS_RESULTSTR, wszCompStr, sizeof ( wszCompStr ) );
if ( lRet > 0 )
{
lRet /= sizeof (WCHAR);
wszCompStr[lRet] = 0 ; // Force terminate
for ( int i = 0 ; i < lRet; ++ i )
{
// AxTrace(0, 0, "Result:%02X", (WCHAR)wszCompStr[i]);
CEGUI::System::getSingleton().injectChar((WCHAR)wszCompStr[i]);
}
}
bRet = true ;
}
_ImmReleaseContext( GetHWND(), hImc );
// Adjust Ime Window Pos. [4/21/2006]
// SetImeWindowPos();
return bRet;
}
OutputDebugStringW( L " WM_IME_COMPOSITION\n " );
{
LONG lRet; // Returned count in CHARACTERS
WCHAR wszCompStr[MAX_COMPSTRING_SIZE];
bool bRet = false ;
// *trapped = true;
if ( NULL == ( hImc = _ImmGetContext( GetHWND() ) ) )
{
break ;
}
if ( lParam & GCS_RESULTSTR )
{
OutputDebugStringW( L " GCS_RESULTSTR\n " );
lRet = _ImmGetCompositionStringW( hImc, GCS_RESULTSTR, wszCompStr, sizeof ( wszCompStr ) );
if ( lRet > 0 )
{
lRet /= sizeof (WCHAR);
wszCompStr[lRet] = 0 ; // Force terminate
for ( int i = 0 ; i < lRet; ++ i )
{
// AxTrace(0, 0, "Result:%02X", (WCHAR)wszCompStr[i]);
CEGUI::System::getSingleton().injectChar((WCHAR)wszCompStr[i]);
}
}
bRet = true ;
}
_ImmReleaseContext( GetHWND(), hImc );
// Adjust Ime Window Pos. [4/21/2006]
// SetImeWindowPos();
return bRet;
}
三 特殊字符输入
case
WM_KEYDOWN:
{
switch ( wParam )
{
case VK_SHIFT:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::LeftShift);
break ;
case VK_CONTROL:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::LeftControl);
break ;
case VK_DELETE:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::Delete);
break ;
case VK_LEFT:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::ArrowLeft);
break ;
case VK_RIGHT:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::ArrowRight);
break ;
case VK_UP:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::ArrowUp);
break ;
case VK_DOWN:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::ArrowDown);
break ;
case VK_HOME:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::Home);
break ;
case VK_END:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::End);
break ;
}
}
break ;
{
switch ( wParam )
{
case VK_SHIFT:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::LeftShift);
break ;
case VK_CONTROL:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::LeftControl);
break ;
case VK_DELETE:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::Delete);
break ;
case VK_LEFT:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::ArrowLeft);
break ;
case VK_RIGHT:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::ArrowRight);
break ;
case VK_UP:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::ArrowUp);
break ;
case VK_DOWN:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::ArrowDown);
break ;
case VK_HOME:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::Home);
break ;
case VK_END:
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::End);
break ;
}
}
break ;
四 复制/粘贴
case
VK_CANCEL:
//
Ctrl-C Copy
case 24 : // Ctrl-X Cut
{
CEGUI::EditboxInterface * pEdit = GetActiveIMEEditBox_Interface();
if (pEdit)
{
if ( 0 != pEdit -> getSelectionLength() && ! (pEdit -> isTextMasked()))
{
// utf32 selection string
CEGUI::String32 szSel = (GetActiveIMEEditBox()) -> getText().substr(pEdit -> getSelectionStartIndex(), pEdit -> getSelectionLength());
size_t length = szSel.length();
if (length > 0 )
{
size_t pos = 0 ;
wchar_t * pWtxt = new wchar_t[length + 1 ];
pWtxt[length] = 0 ;
// utf32 -> utf16
while (length -- )
{
pWtxt[pos] = szSel.at(pos) & 0xFFFF ;
pos ++ ;
}
// paste to clipboard
if (::OpenClipboard(::GetTopWindow(NULL)))
{
::EmptyClipboard();
int size = ::WideCharToMultiByte(CP_ACP, 0 ,pWtxt,wcslen(pWtxt),NULL, 0 ,NULL,FALSE);
// alloc mem
HGLOBAL hglb = ::GlobalAlloc(GMEM_MOVEABLE,(size_t)size + 1 );
char * ptxt = ( char * )::GlobalLock(hglb);
ptxt[size] = 0 ;
// utf16 -> ansi char
::WideCharToMultiByte(CP_ACP, 0 ,pWtxt,wcslen(pWtxt),ptxt,size,NULL,FALSE);
::GlobalUnlock(hglb);
// copy to clipboard
::SetClipboardData(CF_TEXT, hglb);
::CloseClipboard();
// free mem
::GlobalFree(hglb);
}
delete [] pWtxt;
if ((WCHAR)wParam == 24 ) /* Ctrl-X need clear selection */
{
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::Delete);
}
} // end of if(length > 0)
}
} // end of if(pWin)
}
break ;
// Ctrl-V Paste
case 22 :
{
CEGUI::EditboxInterface * pWin = GetActiveIMEEditBox_Interface();
if (pWin)
{
if (::IsClipboardFormatAvailable(CF_TEXT) && ::OpenClipboard(::GetTopWindow(NULL)))
{
HGLOBAL hglb = ::GetClipboardData(CF_TEXT);
if (NULL != hglb)
{
char * ptxt = ( char * )::GlobalLock(hglb);
int size = ::MultiByteToWideChar(CP_ACP, 0 ,ptxt,( int )strlen(ptxt),NULL, 0 );
wchar_t * pWtxt = new wchar_t[size + 1 ];
pWtxt[size] = 0 ;
::MultiByteToWideChar(CP_ACP, 0 ,ptxt,( int )strlen(ptxt),pWtxt,size);
::GlobalUnlock(hglb);
::CloseClipboard();
int pos = 0 ;
while (size -- )
{
CEGUI::System::getSingleton().injectChar((CEGUI::utf32)pWtxt[pos]);
pos ++ ;
}
} // end of if(NULL != hglb)
}
} // end of if(pWin)
}
break ;
case 24 : // Ctrl-X Cut
{
CEGUI::EditboxInterface * pEdit = GetActiveIMEEditBox_Interface();
if (pEdit)
{
if ( 0 != pEdit -> getSelectionLength() && ! (pEdit -> isTextMasked()))
{
// utf32 selection string
CEGUI::String32 szSel = (GetActiveIMEEditBox()) -> getText().substr(pEdit -> getSelectionStartIndex(), pEdit -> getSelectionLength());
size_t length = szSel.length();
if (length > 0 )
{
size_t pos = 0 ;
wchar_t * pWtxt = new wchar_t[length + 1 ];
pWtxt[length] = 0 ;
// utf32 -> utf16
while (length -- )
{
pWtxt[pos] = szSel.at(pos) & 0xFFFF ;
pos ++ ;
}
// paste to clipboard
if (::OpenClipboard(::GetTopWindow(NULL)))
{
::EmptyClipboard();
int size = ::WideCharToMultiByte(CP_ACP, 0 ,pWtxt,wcslen(pWtxt),NULL, 0 ,NULL,FALSE);
// alloc mem
HGLOBAL hglb = ::GlobalAlloc(GMEM_MOVEABLE,(size_t)size + 1 );
char * ptxt = ( char * )::GlobalLock(hglb);
ptxt[size] = 0 ;
// utf16 -> ansi char
::WideCharToMultiByte(CP_ACP, 0 ,pWtxt,wcslen(pWtxt),ptxt,size,NULL,FALSE);
::GlobalUnlock(hglb);
// copy to clipboard
::SetClipboardData(CF_TEXT, hglb);
::CloseClipboard();
// free mem
::GlobalFree(hglb);
}
delete [] pWtxt;
if ((WCHAR)wParam == 24 ) /* Ctrl-X need clear selection */
{
CEGUI::System::getSingleton().injectKeyDown(CEGUI::Key::Delete);
}
} // end of if(length > 0)
}
} // end of if(pWin)
}
break ;
// Ctrl-V Paste
case 22 :
{
CEGUI::EditboxInterface * pWin = GetActiveIMEEditBox_Interface();
if (pWin)
{
if (::IsClipboardFormatAvailable(CF_TEXT) && ::OpenClipboard(::GetTopWindow(NULL)))
{
HGLOBAL hglb = ::GetClipboardData(CF_TEXT);
if (NULL != hglb)
{
char * ptxt = ( char * )::GlobalLock(hglb);
int size = ::MultiByteToWideChar(CP_ACP, 0 ,ptxt,( int )strlen(ptxt),NULL, 0 );
wchar_t * pWtxt = new wchar_t[size + 1 ];
pWtxt[size] = 0 ;
::MultiByteToWideChar(CP_ACP, 0 ,ptxt,( int )strlen(ptxt),pWtxt,size);
::GlobalUnlock(hglb);
::CloseClipboard();
int pos = 0 ;
while (size -- )
{
CEGUI::System::getSingleton().injectChar((CEGUI::utf32)pWtxt[pos]);
pos ++ ;
}
} // end of if(NULL != hglb)
}
} // end of if(pWin)
}
break ;
五 输入框定位
void
SetImeWindowPos(
void
)
{
// Set Ime Wnd Position.
CEGUI::EditboxInterface * pEdit = GetActiveIMEEditBox_Interface();
if (NULL == pEdit) return ;
CEGUI::Window * pWnd = GetActiveIMEEditBox();
if (NULL == pWnd) return ;
CEGUI::Rect ceguiRect = pEdit -> getCaratTextExtent();
if (ceguiRect.getWidth() < 0.01f && ceguiRect.getHeight() < 0.01f ) return ;
POINT pt;
pt.x = ( long )ceguiRect.d_left;
// pt.y = (long)ceguiRect.d_bottom;
pt.y = ( long )ceguiRect.d_top;
HIMC hImc = _ImmGetContext(GetHWND());
if (NULL == hImc) return ;
COMPOSITIONFORM imeForm;
imeForm.dwStyle = CFS_POINT;
imeForm.ptCurrentPos = pt;
_ImmSetCompositionWindow(hImc, & imeForm);
_ImmReleaseContext(GetHWND(),hImc);
}
{
// Set Ime Wnd Position.
CEGUI::EditboxInterface * pEdit = GetActiveIMEEditBox_Interface();
if (NULL == pEdit) return ;
CEGUI::Window * pWnd = GetActiveIMEEditBox();
if (NULL == pWnd) return ;
CEGUI::Rect ceguiRect = pEdit -> getCaratTextExtent();
if (ceguiRect.getWidth() < 0.01f && ceguiRect.getHeight() < 0.01f ) return ;
POINT pt;
pt.x = ( long )ceguiRect.d_left;
// pt.y = (long)ceguiRect.d_bottom;
pt.y = ( long )ceguiRect.d_top;
HIMC hImc = _ImmGetContext(GetHWND());
if (NULL == hImc) return ;
COMPOSITIONFORM imeForm;
imeForm.dwStyle = CFS_POINT;
imeForm.ptCurrentPos = pt;
_ImmSetCompositionWindow(hImc, & imeForm);
_ImmReleaseContext(GetHWND(),hImc);
}