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

📄 jyinput.c

📁 基于minigui的软键盘设计的相关资料
💻 C
📖 第 1 页 / 共 4 页
字号:
//////////////////////////////////////////////////////////////////////////
//	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 + -