📄 jyinput.cpp
字号:
//////////////////////////////////////////////////////////////////////////// Copyright (C) 2007-2008, 福建星网锐捷通讯股份有限公司// All rights reserved.//// 文件名称:JYInput.c// 摘 要://// 日 志// 版 本:1.00// 创 建 者:Chen Jiaqi// 创建时间:2008-1-19 22:58:17//////////////////////////////////////////////////////////////////////////#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <minigui/common.h> #include <minigui/minigui.h>#include <minigui/gdi.h> #include <minigui/window.h> #include <minigui/control.h> #include <minigui/endianrw.h> //#include <minigui/misc.h>#include "pyTbl.h"#include <KeyDef.h>//#ifdef WIN32#include <appinc.h>//#endif#include "JYInput.h"#define FONT_SIZE 12#define METHODAREA_XPOS 2#define METHODAREA_YPOS 2#define SECONDLINE_XPOS 8#define SECONDLINE_YPOS 18// 手写相关定义#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//////////////////////////////////////////////////////////////////////////// 数据处理结构定义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[7]; //chinese input out code char py_code[7]; 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 12static 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 50typedef 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 _Quit_JYInput_Wnd(){ PostMessage(g_hImeWnd, MSG_IME_CLOSE, 0, 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 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -