📄 jyinput.c
字号:
//////////////////////////////////////////////////////////////////////////
// Copyright (C) 2007-2008, 福建星网锐捷通讯股份有限公司
// All rights reserved.
//
// 文件名称:JYInput.c
// 摘 要:
//
// 日 志
// 版 本:1.00
// 创 建 者:Chen Jiaqi
// 创建时间:2008-1-19 22:58:17
//////////////////////////////////////////////////////////////////////////
#include <platform.h>
#include "JYInput.h"
#include "pyTbl.h"
#include "xres.h"
//#define SCREEN_WIDTH 160
//#define SCREEN_HEIGHT 240
//#define IME_LEFT (205)
//#define IME_RIGHT (240)
#define FONT_SIZE 12
#define METHODAREA_XPOS 2
#define METHODAREA_YPOS 2
#define SECONDLINE_XPOS 8
#define SECONDLINE_YPOS 18
#define FIRSTLINE_XPOS 42
#define FIRSTLINE_YPOS 2
// 手写相关定义
#ifndef WIN32
#ifdef IME_HANDWRITE_ENABLE
//指针类消息
#define XM_POINTERFIRST 0x00070000
#define XM_POINTERUP 0x00070001
#define XM_POINTERDOWN 0x00070002
#define XM_POINTERMOVE 0x00070003
#define XM_POINTERLAST 0x0007FFFF
#endif
#endif
/************************************************************************/
/* 按键定义 */
/************************************************************************/
#define KEY_0 '0'
#define KEY_1 '1'
#define KEY_2 '2'
#define KEY_3 '3'
#define KEY_4 '4'
#define KEY_5 '5'
#define KEY_6 '6'
#define KEY_7 '7'
#define KEY_8 '8'
#define KEY_9 '9'
#define KEY_XING '*'
#define KEY_JING '#'
#define KEY_CONTROL 0x80
#define KEY_UP (KEY_CONTROL + 0x1)
#define KEY_DOWN (KEY_CONTROL + 0x2)
#define KEY_LEFT (KEY_CONTROL + 0x3)
#define KEY_RIGHT (KEY_CONTROL + 0x4)
#define KEY_LFUNC (KEY_CONTROL + 0x5)
#define KEY_RFUNC (KEY_CONTROL + 0x6)
//////////////////////////////////////////////////////////////////////////
#define AUTO_COMPLETE_COUNT 39
#define LINE_DISPLAY_MAXCOUNT 10
#define PY_TYPE_MAXCOUNT 7
#define HZ_OUTCODE_MAXCOUNT 10
#define BH_TYPE_MAXCOUNT 10
//////////////////////////////////////////////////////////////////////////
// 数据处理结构定义
typedef struct __tag_INPUT_NODE{
char str[4];
BOOL IsHz;
struct __tag_INPUT_NODE * pre;
struct __tag_INPUT_NODE * next;
}PACKED_END ST_INPUT_NODE;
typedef struct __tag_INPUT_INFO{
struct __tag_INPUT_INFO * head; //input text chain header node
struct __tag_INPUT_INFO * tail;
struct __tag_INPUT_INFO * cursor_pos; //current cursor node
int nPos;
int mode; //input mode(alpha only,digistal only...etc.)
int keymode; //keyboard mode(alpha,chinease,symbol...)
char hz_outcode[HZ_OUTCODE_MAXCOUNT]; //chinese input out code
char py_code[PY_TYPE_MAXCOUNT];
int outcode_cur; //current outcode position(len)
int hz_found_begin; //hz found begin position( in Py_List3 )
int hz_found_end; //hz found end position
int hz_found_cur; //hz found current position
}PACKED_END ST_INPUT_INFO;
typedef struct __tag_EN_INFO{
int nCurKey;
int nPressCount;
int nTime;
}PACKED_END ST_EN_INFO;
typedef struct __tag_PY_INDEX{
struct __tag_PY_INDEX * head;
struct __tag_PY_INDEX * tail;
char szpy[10];
}PACKED_END ST_PY_INDEX;
//////////////////////////////////////////////////////////////////////////
const unsigned int input_alpha_count[10] = {
2, 1, 3, 3, 3, 3, 3, 4, 3, 4
};
const unsigned char input_alpha_list_up[10][4] = {
{'<', '>'},
{'~'},
{'A', 'B', 'C'},
{'D', 'E', 'F'},
{'G', 'H', 'I'},
{'J', 'K', 'L'},
{'M', 'N', 'O'},
{'P', 'Q', 'R', 'S'},
{'T', 'U', 'V'},
{'W', 'X', 'Y', 'Z'}
};
const unsigned char input_alpha_list_low[10][4] = {
{'<', '>'},
{'~'},
{'a', 'b', 'c'},
{'d', 'e', 'f'},
{'g', 'h', 'i'},
{'j', 'k', 'l'},
{'m', 'n', 'o'},
{'p', 'q', 'r', 's'},
{'t', 'u', 'v'},
{'w', 'x', 'y', 'z'}
};
const unsigned int alpha_count[10] = {
0, 0, 3, 3, 3, 3, 3, 4, 3, 4
};
const unsigned char alpha_list[10][4] = {
{'0'},
{'0'},
{'a', 'b', 'c'},
{'d', 'e', 'f'},
{'g', 'h', 'i'},
{'j', 'k', 'l'},
{'m', 'n', 'o'},
{'p', 'q', 'r', 's'},
{'t', 'u', 'v'},
{'w', 'x', 'y', 'z'}
};
#define OFTEN_COUNT (sizeof(often_hz) / sizeof(unsigned char) / 3)
const unsigned char often_hz[][3] = {
"的","一","是","在","不","了","有","和","人","这",
"中","为","上","个","国","我","以","要","产","为",
"工","经","发","民","同","他","大","时","来","用",
"们","生","到","作","地","于","出","就","分","对",
"成","会","业","地","市","也","出","行","作","生"
};
const unsigned char array_symbol[] = {'!', '\"', '#', '/', '%',
'&', '\'', '(', ')', '*',
'+', ',', '-', '.', ':',
';', '<', '=', '>', '?',
'@', '[', '\\', ']', '^',
'_', '`', '{', '|', '}',
' ', '~', '$'};
unsigned char auto_complete[AUTO_COMPLETE_COUNT][2][7] = {
{"con", "cong"},
{ "chon", "chong"},
{ "chua", "chuai"},
{ "chua", "chuan"},
{ "cua", "cuan"},
{ "din", "ding"},
{ "don", "dong"},
{ "dua", "duan"},
{ "go", "gong"},
{ "gon", "gong"},
{ "hon", "hong"},
{ "ho", "hong"},
{ "jion", "jiong"},
{ "kon", "kong"},
{ "lon", "long"},
{ "mia", "mian"},
{ "mia", "miao"},
{ "nia", "nian"},
{ "nia", "niao"},
{ "non", "nong"},
// { "nu", "nuan"},
{ "nua", "nuan"},
{ "qion", "qiong"},
{ "son", "song"},
// { "so", "sou"},
{ "qua", "quan"},
{ "sua", "suan"},
{ "ten", "teng"},
{ "tia", "tian"},
{ "tia", "tiao"},
{ "tin", "ting"},
{ "to", "tong"},
{ "ton", "tong"},
{ "tua", "tuan"},
{ "w", "wa"},
{ "xion", "xiong"},
{ "yon", "yong"},
{ "yua", "yuan"},
{ "zhon", "zhong"},
{ "zon", "zong"},
{ "zua", "zuan"}
};
//////////////////////////////////////////////////////////////////////////
HWND g_hImeWnd = NULL; // 输入法句柄
static HWND m_hosting = NULL; // 父窗口句柄
static HWND m_hImeEdit; // 编辑窗口句柄
static int m_nCallExitKey = SCANCODE_KEY_F4; // 输入法切换键
static BOOL m_IsOpened = FALSE; // 是否已经打开
static BOOL bTwoLines = FALSE;
static int m_nSymbolPage = 0;
static int m_nFirst = 0;
static int m_nPySelect = 0;
static int m_nPyCount = 0;
static int m_nSelectPos = 0;
static int m_often_Hz_Pos = 0;
static int m_assn_Hz_Pos = 0;
static BOOL m_bHZAssn = FALSE; // 汉字智能输入状态开启标识
static int m_nImeAllowMode = JYINPUT_ALLOWMODE;
static int m_nImeCurMode = JYINPUT_DEFAULT;
static ST_EN_INFO m_stEN_info;
static ST_INPUT_INFO m_piinfo;
#define PY_LIST_COUNT 12
static char m_szPylist[100];
static unsigned short key_arrary_hz_select[LINE_DISPLAY_MAXCOUNT * 2 + 1];
//////////////////////////////////////////////////////////////////////////
// 初始化字库
unsigned char *g_pszPyImeArray = NULL; // 拼音
//////////////////////////////////////////////////////////////////////////
// 笔画输入法字库初始化
ST_BHBM *g_pstBhTable = NULL;
int g_nHzAssnWordCount = 0;
#define BHTEXT_MAXSHOWCOUNT 10
#define BHSELECT_MAXCOUNT 50
typedef struct __stbhbm_index
{
unsigned char szfirst[8][BHTEXT_MAXSHOWCOUNT];
unsigned int nBhIndex[8];
}PACKED_END ST_BHBM_INDEX;
static ST_BHBM_INDEX m_stBHIndex;
static char * __g_sBHText = "一丨丿丶乙";
static unsigned short m_sBHHZList[BHSELECT_MAXCOUNT];
static unsigned int m_nBHFind = 0;
static BOOL _init_bh_array()
{
int n = 0;
unsigned char szPreBm[20] = "";
int nIndex = 0;
if (g_pstBhTable == NULL)
return FALSE;
for (n = 0; n < BHBM_COUNT; n++)
{
if (memcmp(( char*)szPreBm, ( char*)(g_pstBhTable[n].szBm), 1))
{
memcpy(( char*)szPreBm, ( char*)(g_pstBhTable[n].szBm), 1);
memcpy(( char*)m_stBHIndex.szfirst[nIndex], (char*)(g_pstBhTable[n].szBm), 1);
m_stBHIndex.nBhIndex[nIndex] = n;
nIndex++;
}
}
m_stBHIndex.nBhIndex[nIndex] = n;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
ST_HZASSN *g_pstAssnArray = NULL;
#define MAX_WORD_COUNT 256 /// 词组备选个数
//static unsigned char m_szAssnWord[MAX_WORD_COUNT][3];
static int m_nAssnSelectIndex = 0;
//////////////////////////////////////////////////////////////////////////
// 内部函数
//////////////////////////////////////////////////////////////////////////
static void _put_often_to_array()
{
int n;
for(n = 0; n < 20; n ++){
unsigned short nTemp;
key_arrary_hz_select[n] =(unsigned short) often_hz[n + m_often_Hz_Pos][0];
nTemp = often_hz[n + m_often_Hz_Pos][1];
key_arrary_hz_select[n] |= (unsigned short)(nTemp << 8);
}
}
static void _put_assn_to_array()
{
if (m_bHZAssn)
{
int n;
for(n = 0; n < LINE_DISPLAY_MAXCOUNT; n ++)
{
int k = n + m_nSelectPos;
if (k > g_pstAssnArray[m_nAssnSelectIndex].nCounts - 1)
break;
key_arrary_hz_select[n] = g_pstAssnArray[m_nAssnSelectIndex].snWords[m_nSelectPos - m_nSelectPos % LINE_DISPLAY_MAXCOUNT + n];
}
}
else
_put_often_to_array();
}
static void _find_assn_to_array(char *szValue)
{
int nLow = 0;
int nHig = g_nHzAssnWordCount - 1;
int nComp = 0;
m_bHZAssn = FALSE;
for (nLow = 0; nLow < g_nHzAssnWordCount; nLow++)
{
nComp = memcmp(szValue, g_pstAssnArray[nLow].szWord, 2);
if (nComp == 0)
{
m_nAssnSelectIndex = nLow;
m_bHZAssn = TRUE;
break;
}
}
}
static BOOL _PostChar2Edit(char* szText, int nChars)
{
if (nChars == 2)
{
if (m_hImeEdit != NULL)
{ // 直接发消息给控件
SetFocus(m_hImeEdit);
SendMessage(m_hImeEdit, MSG_CHAR, *(unsigned short*)szText,0);
}
else
SendMessage(m_hosting, MSG_IME_CHAR, *(unsigned short*)szText,0);
}
else
{
if (m_hImeEdit != NULL)
{ // 直接发消息给控件
SetFocus(m_hImeEdit);
SendMessage(m_hImeEdit, MSG_CHAR, *szText,0);
}
else
SendMessage(m_hosting, MSG_IME_CHAR, *szText,0);
}
//SetFocus(g_hImeWnd);
m_nSelectPos = 0;
if (nChars == 2)
{ // 输入汉字进行智能词组
_find_assn_to_array(szText);
_put_assn_to_array();
}
SetActiveWindow(m_hosting); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
return TRUE;
}
static void _Backspace()
{
int key = 127;
_PostChar2Edit((char*)&key, 1);
}
static void _ExchLowHigh(char *p, int n)
{
int i;
char tmp;
if((n % 2) != 0) n--;
for(i=0; i<n; i+=2){
tmp = p[i];
p[i] = p[i+1];
p[i+1] = tmp;
}
}
static int _mystrncmp(char *str1, char *str2, int size)
{
int i;
for(i=0; i < size; i++, str1++, str2++){
if( *str1 != *str2) break;
}
if(i == size) return 0;
else return *str1 - *str2;
}
static void _ResetVariable()
{
memset(&m_stEN_info, 0, sizeof(ST_EN_INFO));
memset(&m_piinfo, 0, sizeof(ST_INPUT_INFO));
m_nSelectPos = 0;
m_often_Hz_Pos = 0;
m_assn_Hz_Pos = 0;
m_IsOpened = 1;
m_bHZAssn = FALSE;
m_piinfo.keymode = m_nImeCurMode;
#ifdef IME_HANDWRITE_ENABLE
//HW_ResetVariable();
#endif
}
static void _SwitchVariable()
{
int nCurKeymode = m_piinfo.keymode;
memset(&m_stEN_info, 0, sizeof(ST_EN_INFO));
memset(&m_piinfo, 0, sizeof(ST_INPUT_INFO));
m_nSelectPos = 0;
m_often_Hz_Pos = 0;
m_assn_Hz_Pos = 0;
m_piinfo.keymode = nCurKeymode;
}
static void _SetInputMode(int nInputMode, int nDefInputMode)
{
m_nImeAllowMode = nInputMode;
m_nImeCurMode = nDefInputMode;
m_piinfo.keymode = m_nImeCurMode;
}
// 获取是否为可用输入法
static BOOL _GetModeEnable(int nMode)
{
int nNewMode = nMode;
BOOL bFlag = FALSE;
if (nNewMode == m_nImeAllowMode)
return TRUE;
while (1)
{
nNewMode = nNewMode << 1;
if(nNewMode > m_nImeAllowMode)
{
if (bFlag)
return FALSE;
nNewMode = 1;
bFlag = TRUE;
}
if((nMode & m_nImeAllowMode) == nMode)
return TRUE;
if(nNewMode == nMode)
return TRUE;
}
return FALSE;
}
// 获取下一个可用输入法
static int _GetNextMode(int nMode)
{
int nNewMode = nMode;
if(nNewMode == m_nImeAllowMode)
return nNewMode;
while (1)
{
nNewMode = nNewMode << 1;
if(nNewMode > m_nImeAllowMode)
{
nNewMode = 1;
}
if((nNewMode & m_nImeAllowMode) == nNewMode)
return nNewMode;
if(nNewMode == nMode)
return nNewMode;
}
}
static void _TextOutPY( HDC hdc)
{
ST_INPUT_INFO *piinfo = &m_piinfo;
if (m_nPyCount != 0)
{
if (strlen(m_szPylist) <= PY_LIST_COUNT)
{
TextOut(hdc, FONT_SIZE * 3 + 5, 0, m_szPylist);
m_nFirst = 0;
}
else
{
int nShow, nCount, nBegin, nOffset;
char szTextOut[PY_LIST_COUNT + 4] = "";
nShow = (PY_LIST_COUNT - 2) / (piinfo->outcode_cur + 1);
nCount = (piinfo->outcode_cur + 1) * nShow;
if (m_nPySelect >= m_nFirst + nShow) {
m_nFirst ++;
}
if (m_nPySelect == 0)
{
m_nFirst = 0;
}
nBegin = m_nFirst*(piinfo->outcode_cur + 1);
nOffset = 0;
if (m_nFirst) {
nOffset = 1;
}
if (m_nFirst > 0) {
szTextOut[0] = '<';
}
memcpy(szTextOut + nOffset, m_szPylist + nBegin, nCount);
if (nShow + m_nFirst < m_nPyCount)
{
szTextOut[nOffset + nCount] = '>';
}
TextOut(hdc, FONT_SIZE * 3 + 5, 0, szTextOut);
}
}
}
static BOOL _XorPyList(HDC hdc)
{
ST_INPUT_INFO *piinfo = &m_piinfo;
if (piinfo->outcode_cur > 0)
{
int nOffset, y;
_TextOutPY(hdc);
nOffset = m_nFirst? 1: 0;
for(y = 2; y < 2 + 14; y ++)
{
int x;
int xPos = FONT_SIZE * 3 + 5 + 8 * (piinfo->outcode_cur + 1) * (m_nPySelect - m_nFirst) + 8 * nOffset;
for(x = xPos; x < xPos + 8 * piinfo->outcode_cur; x ++){
SetPixel(hdc, x, y, ~GetPixel(hdc, x, y) );
}
}
}
return TRUE;
}
static BOOL _XorHzSelect(HDC hdc)
{
ST_INPUT_INFO *piinfo = &m_piinfo;
int x, y;
for(y = SECONDLINE_YPOS - 1; y < SECONDLINE_YPOS * 2 - 5; y ++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -