⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jyinput.cpp

📁 嵌入式终端中文输入法(for MiniGUI) 包括拼音、笔画、英文大小写、符号等
💻 CPP
📖 第 1 页 / 共 4 页
字号:
////////////////////////////////////////////////////////////////////////////	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 + -