📄 toascii.c
字号:
/*++
Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved
Module Name:
toascii.c
++*/
#include <windows.h>
#include <imm.h>
#include <imedefs.h>
/**********************************************************************/
/* IsUsedCode() */
/* Return Value: */
/* TURE: is UsedCode; FALSE: is'nt UsedCode; */
/**********************************************************************/
BOOL IsUsedCode(
WORD wCharCode)
{
WORD wFlg;
for(wFlg=0; wFlg<sImeG.wNumCodes; wFlg++)
if (wCharCode == sImeG.UsedCodes[wFlg])
break;
if(wFlg < sImeG.wNumCodes)
return (TRUE);
return (FALSE);
}
/**********************************************************************/
/* GBProcessKey() */
/* Return Value: */
/* different state which input key will change IME to (CST_ */
/**********************************************************************/
UINT PASCAL GBProcessKey( // this key will cause the IME go to what state
WORD wCharCode,
LPPRIVCONTEXT lpImcP)
{
if (!lpImcP) {
return (CST_INVALID);
}
// check 第一个输入为 space and 0 ~ 9
if (wCharCode == TEXT(' ') ||
(wCharCode >= TEXT('0') && wCharCode <= TEXT('9')) )
{ ////显示选择框,按空格如何处理??? 一个蒙文字母输入完毕.
//if (lpImcP->bSeq[0] && lpImcP->bSeq[1])
//{
// return (CST_INPUT);
//}
//else
//{
if (!lpImcP->bSeq[0]) ////没有输入的时候,原字符输出
{
return (CST_ALPHANUMERIC);
}
else
{
return (CST_INPUT);
//return (CST_INVALID_INPUT);
}
//}
}
/*/ check finalize char
if ((wCharCode >= TEXT('0') && wCharCode <= TEXT('9'))
||(wCharCode >= TEXT('a') && wCharCode <= TEXT('f'))
||(wCharCode == TEXT('?'))) {
if (!lpImcP->bSeq[0]) {
if (wCharCode == TEXT('?')){
// 0x0??? - 0xF??? is OK
return (CST_ALPHANUMERIC);
} else {
// there is no 0x0??? - 0x7???
lpImcP->bSeq[1] = TEXT('\0');
return (CST_INPUT);
}
} else if (!lpImcP->bSeq[1]) {
if (lpImcP->bSeq[0] >=TEXT('0') && lpImcP->bSeq[0] <= TEXT('9')){ //Area
if ((lpImcP->bSeq[0] == TEXT('0') && wCharCode == TEXT('0'))
||(lpImcP->bSeq[0] == TEXT('9') && wCharCode >= TEXT('5'))
||(wCharCode >= TEXT('a') && wCharCode <= TEXT('f'))
||(wCharCode == TEXT('?'))) {
// there is less than 95 area and bigger than 0 area
return (CST_INVALID_INPUT);
}
else {
lpImcP->bSeq[2] = TEXT('\0');
return (CST_INPUT);
}
}
if (lpImcP->bSeq[0] >= TEXT('a') && lpImcP->bSeq[0] <= TEXT('f')) { //GB
if ((lpImcP->bSeq[0] == TEXT('a') && wCharCode == TEXT('0'))
||(lpImcP->bSeq[0] == TEXT('f') && wCharCode == TEXT('f'))
||(wCharCode == TEXT('?'))) {
// there is less than 95 area and bigger than 0 area
return (CST_INVALID_INPUT);
}
else {
lpImcP->bSeq[2] = TEXT('\0');
return (CST_INPUT);
}
}
} else if (!lpImcP->bSeq[2]) {
if (wCharCode == TEXT('?')){
return (CST_INPUT);
}
if (lpImcP->bSeq[0] >= TEXT('0') && lpImcP->bSeq[0] <= TEXT('9')){ //Area
if (wCharCode >= TEXT('0') && wCharCode <= TEXT('9')) {
lpImcP->bSeq[3] = TEXT('\0');
return (CST_INPUT);
} else {
return (CST_INVALID_INPUT);
}
}
if (lpImcP->bSeq[0] >= TEXT('a') && lpImcP->bSeq[0] <= TEXT('f')) { //GB
if (wCharCode >= TEXT('a') && wCharCode <= TEXT('f')) {
lpImcP->bSeq[3] = TEXT('\0');
return (CST_INPUT);
} else {
return (CST_INVALID_INPUT);
}
}
} else if (!lpImcP->bSeq[3]) {
if (lpImcP->bSeq[2] == TEXT('?')) {
if (wCharCode == TEXT('?')) {
return (CST_INPUT);
}else{
return (CST_INVALID_INPUT);
}
}
if (lpImcP->bSeq[0] >= TEXT('0') && lpImcP->bSeq[0] <= TEXT('9')) { //Area
if ((lpImcP->bSeq[2] == TEXT('0') && wCharCode == TEXT('0'))
||(lpImcP->bSeq[2] == TEXT('9') && wCharCode >= TEXT('5'))
||(wCharCode >= TEXT('a') && wCharCode <= TEXT('f'))
||(wCharCode == TEXT('?'))) {
// there is less than 95 area and bigger than 0 area
return (CST_INVALID_INPUT);
}
else {
return (CST_INPUT);
}
}
if (lpImcP->bSeq[0] >= TEXT('a') && lpImcP->bSeq[0] <= TEXT('f')) { //GB
if ((lpImcP->bSeq[2] == TEXT('a') && wCharCode == TEXT('0'))
||(lpImcP->bSeq[2] == TEXT('f') && wCharCode == TEXT('f'))
||(wCharCode == TEXT('?'))){
// there is less than 95 area and bigger than 0 area
return (CST_INVALID_INPUT);
}
else {
return (CST_INPUT);
}
}
} else {
return (CST_INVALID_INPUT);
}
} else if (wCharCode >= TEXT(' ') && wCharCode <= TEXT('~')) {
return (CST_ALPHANUMERIC);
} else {
return (CST_INVALID_INPUT);
}
*/
if( IsUsedCode(wCharCode) )
{
return (CST_INPUT);
}
return (CST_INVALID_INPUT);
}
/**********************************************************************/
/* UnicodeProcessKey() */
/* Return Value: */
/* different state which input key will change IME to (CST_ */
/**********************************************************************/
UINT PASCAL UnicodeProcessKey( // this key will cause the IME go to what state
WORD wCharCode,
LPPRIVCONTEXT lpImcP)
{
if (!lpImcP) {
return (CST_INVALID);
}
if (wCharCode == TEXT(' ')) {
if (lpImcP->bSeq[0] && lpImcP->bSeq[1]) {
return (CST_INPUT);
} else if (!lpImcP->bSeq[0]) {
return (CST_ALPHANUMERIC);
} else {
return (CST_INVALID_INPUT);
}
}
// check finalize char
// 0000 -- ffff
if ((wCharCode >= TEXT('0') && wCharCode <= TEXT('9'))
||(wCharCode >= TEXT('a') && wCharCode <= TEXT('f'))
||(wCharCode == TEXT('?'))) {
if (wCharCode == TEXT('?')){
if (!lpImcP->bSeq[2]) {
return (CST_INPUT);
}else
return(CST_INVALID_INPUT);
}else{
return (CST_INPUT);
}
} else if(lpImcP->bSeq[0]){
return (CST_INVALID_INPUT);
} else
return (CST_ALPHANUMERIC);
}
/**********************************************************************/
/* XGBProcessKey() */
/* Return Value: */
/* different state which input key will change IME to (CST_ */
/**********************************************************************/
UINT PASCAL XGBProcessKey( // this key will cause the IME go to what state
WORD wCharCode,
LPPRIVCONTEXT lpImcP)
{
if (!lpImcP) {
return (CST_INVALID);
}
if (wCharCode == TEXT(' ')) {
if (lpImcP->bSeq[0] && lpImcP->bSeq[1]) {
return (CST_INPUT);
} else if (!lpImcP->bSeq[0]) {
return (CST_ALPHANUMERIC);
} else {
return (CST_INVALID_INPUT);
}
}
// check finalize char
//lead byte 81 - fe
//trail byte 40 - 7e, 80 - fe
if ((wCharCode >= TEXT('0') && wCharCode <= TEXT('9'))
||(wCharCode >= TEXT('a') && wCharCode <= TEXT('f'))
||(wCharCode == TEXT('?'))) {
if (!lpImcP->bSeq[0]) {
if (wCharCode == TEXT('?')) {
// 0x0??? - 0xF??? is OK
// : - @ was filted
return (CST_ALPHANUMERIC);
}else if (wCharCode >=TEXT('8') && wCharCode <= TEXT('f')){
// 0x0??? - 0xF??? is OK
lpImcP->bSeq[1] = TEXT('\0');
return (CST_INPUT);
} else {
// there is no 0x0??? - 0x7???
return (CST_INVALID_INPUT);
}
} else if (!lpImcP->bSeq[1]) {
if ((lpImcP->bSeq[0] == TEXT('f') && wCharCode == TEXT('f'))
||(lpImcP->bSeq[0] == TEXT('8') && wCharCode == TEXT('0'))
||(wCharCode == TEXT('?'))) {
//XGB is 81 - fe
return (CST_INVALID_INPUT);
}
else {
lpImcP->bSeq[2] = TEXT('\0');
return (CST_INPUT);
}
} else if (!lpImcP->bSeq[2]) {
if (wCharCode == TEXT('?')){
lpImcP->bSeq[3] = TEXT('\0');
return (CST_INPUT);
}
if (wCharCode >= TEXT('4') && wCharCode <= TEXT('f')) {
lpImcP->bSeq[3] = TEXT('\0');
return (CST_INPUT);
} else {
return (CST_INVALID_INPUT);
}
} else if (!lpImcP->bSeq[3]) {
if (lpImcP->bSeq[2] == TEXT('?')) {
if (wCharCode == TEXT('?')) {
return (CST_INPUT);
}else{
return (CST_INVALID_INPUT);
}
}
if ((lpImcP->bSeq[2] == TEXT('7') && wCharCode == TEXT('f'))
||(lpImcP->bSeq[2] == TEXT('f') && wCharCode == TEXT('f'))
||(wCharCode == TEXT('?'))) {
//trail byte
//40 - 7e, 80 - fe
return (CST_INVALID_INPUT);
}
else {
return (CST_INPUT);
}
} else {
return (CST_INVALID_INPUT);
}
} else if (wCharCode >= TEXT(' ') && wCharCode <= TEXT('~')) {
return (CST_ALPHANUMERIC);
} else {
return (CST_INVALID_INPUT);
}
}
/**********************************************************************/
/* ProcessKey() */
/* Return Value: */
/* different state which input key will change IME to (CST_ */
/**********************************************************************/
UINT PASCAL ProcessKey( // this key will cause the IME go to what state
WORD wCharCode,
UINT uVirtKey,
UINT uScanCode,
LPBYTE lpbKeyState,
LPINPUTCONTEXT lpIMC,
LPPRIVCONTEXT lpImcP)
{
if (!lpIMC) {
return (CST_INVALID);
}
if (!lpImcP) {
return (CST_INVALID);
}
// filter system key (alt,alt+,ctrl,shift)
// and fOpen, IME_CMODE_NOCONVERSION
if (uVirtKey == VK_MENU) { // ALT key
return (CST_INVALID);
} else if (uScanCode & KF_ALTDOWN) { // ALT-xx key
return (CST_INVALID);
} else if (uVirtKey == VK_CONTROL) { // CTRL key
return (CST_INVALID);
} else if (uVirtKey == VK_SHIFT) { // SHIFT key
return (CST_SHIFT);//用shift做为英蒙转换
} else if (!lpIMC->fOpen) { // don't compose in
// close status
return (CST_INVALID);
} else if (lpIMC->fdwConversion & IME_CMODE_NOCONVERSION) {
// Caps on/off
if(uVirtKey == VK_CAPITAL) {
return (CST_CAPITAL);
}else
return (CST_INVALID);
} else if (uVirtKey >= VK_NUMPAD0 && uVirtKey <= VK_DIVIDE) {
return (CST_INVALID);
} else {
}
// Caps on/off
if(uVirtKey == VK_CAPITAL) {
return (CST_CAPITAL);
}
if ((lpIMC->fdwConversion & IME_CMODE_SOFTKBD)
&& (lpImeL->dwSKWant != 0)){
if (wCharCode >= TEXT(' ') && wCharCode <= TEXT('~')) {
return (CST_SOFTKB);
} else {
return (CST_INVALID);
}
}
// candidate alaredy open, <,>,pageup,pagedown,?,ECS,key
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
if (uVirtKey == VK_PRIOR) { // PageUp
return (CST_CHOOSE);
} else if (uVirtKey == VK_NEXT) { // PageDown
return (CST_CHOOSE);
} else if (wCharCode == TEXT('-')) {
return (CST_CHOOSE);
} else if (wCharCode == TEXT('=')) {
return (CST_CHOOSE);
} else if (uVirtKey == VK_HOME) {
return (CST_CHOOSE);
} else if (uVirtKey == VK_END) {
return (CST_CHOOSE);
} else if (uVirtKey == VK_ESCAPE) { // Esc
return (CST_CHOOSE);
} else if (wCharCode == TEXT(' ')) {
return (CST_CHOOSE);
} else {
}
}
// candidate alaredy open, shift + num key
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
if ((wCharCode >= TEXT('0')) && wCharCode <= TEXT('9')) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -