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

📄 inputmth.c

📁 HGui4.1.rar
💻 C
字号:
//---------------------------------------------------------------------------------
// Copyright (c) Haisoft 2006-9-1
// Copyright jinhailiao 2008-2010
// E-mail:   jinhailiao@163.com
// Project:			HGui
// File:			inputmth.c
// Description:		
//-------------------------------------------------------------
// Reversion Histroy:
//-------------------------------------------------------------
// Version		date		operations				by who
// 2.0.0		2007-09-06  create                  Kingsea
// 3.0.0		2008-03-01	update					Kingsea
//---------------------------------------------------------------------------------
#include "haitype.h"
#include "haihandle.h"
#include "haievent.h"
#include "haiscene.h"
#include "_haiscene.h"
#include "_haictrl.h"
#include "haigui.h"
#include "_haigdi.h"
#include "haigdi.h"
#include "virkey.h"
#include "haimem.h"


//data
//
static const S_BYTE WuBiData[] = 
{
#include "wubidata.h"
	0x00
};

static const S_BYTE WuBiOffset[] = 
{
#include "wubiindex.h"
	0x00
};

static const S_WORD WuBiIndex[] = 
{
	0x0000, 0x0504, 0x075A, 0x0970, 0x0F25, 0x11BA, 0x16FC, 0x1C51,
	0x1E1C, 0x23F1, 0x272D, 0x2AE4, 0x2D72, 0x2FC1, 0x332E, 0x3594,
	0x3910, 0x3DC8, 0x435D, 0x473D, 0x4DBE, 0x5320, 0x552B, 0x5B85,
	0x5E98, 0x6392
};

static const S_BYTE NumPrompt[5][3] =
{
	"1.", "2.", "3.", "4.", "5."
};

//macro
//
#define WUBI_DATA_OFFSET_MAX_BYTE		3


//variable
//
//SP_CTRL pInputCtrl = S_NULL;
//S_CTRL  InputCtrl;
//S_BYTE  InputText[INPUTM_INPUT_TEXT_LENGTH_MAX];
//S_BYTE  InputPromptText[INPUTM_TEXT_LINE_MAX][INPUTM_DISP_TEXT_LENGTH_MAX];

//function prototype
//
S_DWORD hai_WubiInputMethodCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam);

//function
//
SP_CTRL _hai_CreateWubiInputMethod(S_VOID)
{
	S_BYTE i;
	S_BYTE *pInputText=S_NULL, *pInputPromptText=S_NULL;
	SP_CTRL pInputCtrl=S_NULL;

	pInputCtrl = hai_MemAlloc(sizeof(*pInputCtrl));
	pInputText = hai_MemAlloc(INPUTM_INPUT_TEXT_LENGTH_MAX);
	pInputPromptText = hai_MemAlloc(INPUTM_TEXT_LINE_MAX*INPUTM_DISP_TEXT_LENGTH_MAX);
	if (!pInputCtrl || !pInputText || !pInputPromptText)
	{
		if (pInputCtrl)  hai_MemFree(pInputCtrl);
		if (pInputText) hai_MemFree(pInputText);
		if (pInputPromptText) hai_MemFree(pInputPromptText);
		return S_NULL;
	}

	memset(pInputCtrl, 0x00, sizeof(*pInputCtrl));
	pInputCtrl->CtrlID   = 0xFF;
	pInputCtrl->CtrlType = CT_INPUTM;
	pInputCtrl->style   = INPUTM_TYPE_WUBI;
	pInputCtrl->visible = 1;
	pInputCtrl->x = (LCD_WIDTH-320)>>1;
	pInputCtrl->y = LCD_HEIGHT - 20;
	pInputCtrl->w = 320;
	pInputCtrl->h = 20;
	pInputCtrl->CtrlProc = hai_WubiInputMethodCtrlProc;
	pInputCtrl->InputMethodData.pInputText = pInputText;
	for (i = 0; i < INPUTM_TEXT_LINE_MAX; i++)
		pInputCtrl->InputMethodData.DisplayText[i] = &pInputPromptText[i*INPUTM_DISP_TEXT_LENGTH_MAX];

	memset(pInputCtrl->InputMethodData.pInputText, 0x00, INPUTM_INPUT_TEXT_LENGTH_MAX);
	for (i = 0; i < INPUTM_TEXT_LINE_MAX; i++)
		memset(pInputCtrl->InputMethodData.DisplayText[i], 0x00, INPUTM_DISP_TEXT_LENGTH_MAX);
	for (i = 0; i < INPUTM_TEXT_LINE_MAX; i++)
		strcpy(pInputCtrl->InputMethodData.DisplayText[i], NumPrompt[i]);

	return pInputCtrl;
}

S_BOOL _hai_DestroyWubiInputMethod(SP_CTRL pInputCtrl)
{
	if (!pInputCtrl || pInputCtrl->CtrlType != CT_INPUTM)
		return S_FALSE;
	if (pInputCtrl->style != INPUTM_TYPE_WUBI)
		return S_FALSE;

	hai_MemFree(pInputCtrl->InputMethodData.pInputText);
	hai_MemFree(pInputCtrl->InputMethodData.DisplayText[0]);
	hai_MemFree(pInputCtrl);

	return S_TRUE;
}

S_BYTE *hai_FindAlpha(S_BYTE *StrBuf)
{
	while (*StrBuf)
	{
		if (*StrBuf & 0x80)
			StrBuf += 2;
		else
			break;
	}
	return StrBuf;
}

S_VOID _hai_WuBiDataSearch(SP_CTRL pInputCtrl)
{
	S_BYTE i, ch;
	S_SHORT match;
	S_WORD  LowItem, MidItem, HighItem;
	S_DWORD CurrOffset, NextOffset;
	S_BYTE  WuBiDataBuf[20], *pAlpha;

	ch = pInputCtrl->InputMethodData.pInputText[0];
	if (!ch || ch == 'z')
	{
		pInputCtrl->InputMethodData.CurrDataIndex = 0;
		for (i = 0; i < INPUTM_TEXT_LINE_MAX; i++)
			memset(pInputCtrl->InputMethodData.DisplayText[i], 0x00, INPUTM_DISP_TEXT_LENGTH_MAX);
		for (i = 0; i < INPUTM_TEXT_LINE_MAX; i++)
			strcpy(pInputCtrl->InputMethodData.DisplayText[i], NumPrompt[i]);
		return;
	}

	ch -= 'a';
	LowItem = WuBiIndex[ch];
	if (pInputCtrl->InputMethodData.pInputText[1])
	{
		HighItem = WuBiIndex[ch+1];
		while (LowItem < HighItem)
		{
			MidItem = (LowItem + HighItem) / 2;
			CurrOffset = 0; NextOffset = 0;
			memcpy(&CurrOffset, &WuBiOffset[MidItem*3], 3);
			memcpy(&NextOffset, &WuBiOffset[(MidItem+1)*3], 3);
			memcpy(WuBiDataBuf, &WuBiData[CurrOffset], NextOffset-CurrOffset);
			WuBiDataBuf[NextOffset-CurrOffset] = 0;
			pAlpha = hai_FindAlpha(WuBiDataBuf);
			match = strcmp(pInputCtrl->InputMethodData.pInputText, pAlpha);
			if (match == 0)
				break;
			else if (match > 0)
				LowItem = MidItem+1;
			else
				HighItem = MidItem-1;
		}
		if (match == 0)
		{
			LowItem = MidItem;
		}
	}

	pInputCtrl->InputMethodData.CurrDataIndex = LowItem;

	for (i = 0; i < INPUTM_TEXT_LINE_MAX; i++)
		strcpy(pInputCtrl->InputMethodData.DisplayText[i], NumPrompt[i]);
	for (i = 0; i < INPUTM_TEXT_LINE_MAX && LowItem < WuBiIndex[25]; i++)
	{
		CurrOffset = 0; NextOffset = 0;
		memcpy(&CurrOffset, &WuBiOffset[LowItem * WUBI_DATA_OFFSET_MAX_BYTE], WUBI_DATA_OFFSET_MAX_BYTE);
		memcpy(&NextOffset, &WuBiOffset[(LowItem+1) * WUBI_DATA_OFFSET_MAX_BYTE], WUBI_DATA_OFFSET_MAX_BYTE);
		memcpy(&(pInputCtrl->InputMethodData.DisplayText[i][2]), &WuBiData[CurrOffset], NextOffset-CurrOffset);
		pInputCtrl->InputMethodData.DisplayText[i][NextOffset-CurrOffset+2] = 0;
		LowItem += 1;
	}

	return;
}

S_VOID  _hai_SendFont(S_BYTE *Font)
{
	S_WORD HaZi;
	SH_CTRL hFocusCtrl = hai_GetCurSceneFocusCtrl();

	while (*Font & 0x80)
	{
		HaZi = (S_WORD)*Font<<8 | *(Font+1);
		if (hFocusCtrl)
			((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_CHAR, (WPARAM)HaZi, 0);
		else
			hai_SendEvent(EVT_CHAR, (WPARAM)HaZi, 0);
		Font += 2;
	}
}

S_DWORD hai_WubiInputMethodCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
	S_BYTE  bkmode;
	SH_DC   hDC;
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;
	SH_CTRL hFocusCtrl = hai_GetCurSceneFocusCtrl();
	
	switch (event)
	{
	case EVT_CREAT:
		break;
	case EVT_PAINT:
		if (!pCtrl->visible)
			break;
		hDC = hai_GetScreenDC();
		hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, BLOCK_3D_UP, GRAY_BRUSH);
		hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y+2), 44, 16, BLOCK_3D_DN, LTGRAY_BRUSH);
		hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+46), (S_SHORT)(pCtrl->y+2), 272, 16, BLOCK_3D_DN, LTGRAY_BRUSH);
		bkmode = hai_SetBkMode(hDC, BKM_TRANSPARENT);
		hai_TextOut(hDC, (S_SHORT)(pCtrl->x+6), (S_SHORT)(pCtrl->y+4), pCtrl->InputMethodData.pInputText, 0);
		hai_TextOut(hDC, (S_SHORT)(pCtrl->x+50), (S_SHORT)(pCtrl->y+4), pCtrl->InputMethodData.DisplayText[0], 0);
		hai_TextOut(hDC, (S_SHORT)(pCtrl->x+142), (S_SHORT)(pCtrl->y+4), pCtrl->InputMethodData.DisplayText[1], 0);
		hai_TextOut(hDC, (S_SHORT)(pCtrl->x+234), (S_SHORT)(pCtrl->y+4), pCtrl->InputMethodData.DisplayText[2], 0);
		hai_SetBkMode(hDC, bkmode);
		hai_ReleaseDC(hDC);
		if (!hai_IsNeedRedraw())
			hai_UpdateWindow(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		break;	
	case EVT_TIMER:
		break;	
	case EVT_KEYDN:
		switch (wParam)
		{
		case VK_ESCAPE:
		case VK_SPACE:
		case VK_RETURN:
			if (pCtrl->InputMethodData.InputIndicate)
			{
			}
			else
			{
				if (hFocusCtrl)
					((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_KEYDN, wParam, lParam);
				else
					hai_SendEvent(EVT_KEYDN, wParam, lParam);
			}
			break;
		case VK_BACK:
			if (pCtrl->InputMethodData.InputIndicate)
			{
				pCtrl->InputMethodData.pInputText[--pCtrl->InputMethodData.InputIndicate] = '\0';
				_hai_WuBiDataSearch(pCtrl);
				pCtrl->CtrlProc(hCtrl, EVT_PAINT, 0, 0);
			}
			else
			{
				if (hFocusCtrl)
					((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_KEYDN, wParam, lParam);
				else
					hai_SendEvent(EVT_KEYDN, wParam, lParam);
			}
			break;
		default:
			if (hFocusCtrl)
				((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_KEYDN, wParam, lParam);
			else
				hai_SendEvent(EVT_KEYDN, wParam, lParam);
			break;
		}
		break;
	case EVT_KEYUP:
		switch (wParam)
		{
		case VK_SPACE:
		case VK_RETURN:
			if (pCtrl->InputMethodData.InputIndicate)
			{
				if (pCtrl->InputMethodData.DisplayText[0][2])
					_hai_SendFont(&(pCtrl->InputMethodData.DisplayText[0][2]));
				memset(pCtrl->InputMethodData.pInputText, 0x00, INPUTM_INPUT_TEXT_LENGTH_MAX);
				pCtrl->InputMethodData.InputIndicate = 0;
				pCtrl->CtrlProc(hCtrl, EVT_PAINT, 0, 0);
			}
			else
			{
				if (hFocusCtrl)
					((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_KEYUP, wParam, lParam);
				else
					hai_SendEvent(EVT_KEYUP, wParam, lParam);
			}
			break;
		case VK_ESCAPE:
			if (pCtrl->InputMethodData.InputIndicate)
			{
				pCtrl->InputMethodData.InputIndicate = 0;
				pCtrl->InputMethodData.pInputText[0] = '\0';
				_hai_WuBiDataSearch(pCtrl);
				pCtrl->CtrlProc(hCtrl, EVT_PAINT, 0, 0);
			}
			else
			{
				if (hFocusCtrl)
					((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_KEYUP, wParam, lParam);
				else
					hai_SendEvent(EVT_KEYUP, wParam, lParam);
			}
			break;
		case VK_BACK:
			if (pCtrl->InputMethodData.InputIndicate)
			{
			}
			else
			{
				if (hFocusCtrl)
					((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_KEYUP, wParam, lParam);
				else
					hai_SendEvent(EVT_KEYUP, wParam, lParam);
			}
			break;
		default:
			if (hFocusCtrl)
				((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_KEYUP, wParam, lParam);
			else
				hai_SendEvent(EVT_KEYUP, wParam, lParam);
			break;
		}
		break;
	case EVT_CHAR:
		if (wParam > '0' && wParam <= '0'+INPUTM_TEXT_LINE_MAX)
		{
			if (pCtrl->InputMethodData.DisplayText[wParam-'0'-1][2])
				_hai_SendFont(&(pCtrl->InputMethodData.DisplayText[wParam-'0'-1][2]));
			memset(pCtrl->InputMethodData.pInputText, 0x00, INPUTM_INPUT_TEXT_LENGTH_MAX);
			pCtrl->InputMethodData.InputIndicate = 0;
			pCtrl->CtrlProc(hCtrl, EVT_PAINT, 0, 0);
		}
		else if (wParam >= 'a' && wParam <= 'z')
		{
			if (pCtrl->InputMethodData.InputIndicate < 4)
				pCtrl->InputMethodData.pInputText[pCtrl->InputMethodData.InputIndicate++] = (S_BYTE)wParam;
			_hai_WuBiDataSearch(pCtrl);
			pCtrl->CtrlProc(hCtrl, EVT_PAINT, 0, 0);
		}
		else
		{
			if (!pCtrl->InputMethodData.pInputText[0])
			{
				if (hFocusCtrl)
					((SP_CTRL)hFocusCtrl)->CtrlProc(hFocusCtrl, EVT_CHAR, wParam, lParam);
				else
					hai_SendEvent(EVT_CHAR, wParam, lParam);
			}
		}
		break;
	case EVT_SYSKEY:
		break;
	case EVT_DESTROY:
		if (hai_IsNeedRedraw())
			_hai_SetInvalidRectEx(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		else
			hai_InvalidRectEx(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		break;
	case EVT_MOUSEDN:
		break;
	case EVT_MOUSEUP:
		break;
	case EVT_MOUSEDB:
		break;
	case EVT_MOUSEMV:
		break;
	case EVT_RESTORE:
		break;
	case EVT_COMMAND:
		break;
	default:
		break;
	}
	return 0;
}

SP_CTRL _hai_CreateInputMethod(S_BYTE InputMethodType)
{
	SP_CTRL pCtrl = S_NULL;
	
	switch (InputMethodType)
	{
	case INPUTM_TYPE_WUBI:
		pCtrl = _hai_CreateWubiInputMethod();
		break;
	default:
		break;
	}

	return pCtrl;
}

S_BOOL _hai_DestroyInputMethod(SP_CTRL pInputCtrl)
{
	if (!pInputCtrl)
		return S_FALSE;
	if (pInputCtrl->CtrlType != CT_INPUTM)
		return S_FALSE;

	switch (pInputCtrl->style)
	{
	case INPUTM_TYPE_WUBI:
		_hai_DestroyWubiInputMethod(pInputCtrl);
		break;
	default:
		return S_FALSE;
	}
	
	return S_TRUE;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -