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

📄 mmichineseinput.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
ZI8WCHAR Uni_strlen(PZI8WCHAR String);

/* 2003/10/13 sunsj/ onekey press pinyin method */
void Zi_onekey_keypress(pIME_DATA pIME , PZI8WCHAR key_map);    /* enter the key and get pinyin and candidate */
int Zi_GetElementCandidates(pIME_DATA pIME);                    /* getcandidate through element */
void UnicodeConver(USHORT* inputString, USHORT* outputString);
void Zi_onekey_clear(pIME_DATA pIME);   /* clear element or text */
void IMECandidatePageUp(pIME_DATA pIME);    /* page up candidate */
void IMECandidatePageDown(pIME_DATA pIME);  /* page down candidate */
void ElementHighlightDisplayContorl(pIME_DATA pIME);    /* display highlight element */

/*************************************************************************
   Start: Fummy functions. This is to be removed when eZiText code is received 
/*************************************************************************/
//ZI8UCHAR Zi8GetCandidates(PZI8GETPARAM pGetParam);
//void Zi8Initialize(void);
/* End */
UBYTE LatinChar(ZI8WCHAR char_code)
{   //if last byte is 0x00 and first byte is between 0x20 and 0x7E
    if ( (char_code% 0x100 == 0)&&(char_code>=0x2000) && (char_code<0x7F00) )
        return TRUE;
    else
        return FALSE;
}

/*******************************************************************************

 $Function:    	chinese_input

 $Description:	
 
 $Returns:		

 $Arguments:	
 
*******************************************************************************/
T_MFW_HND chinese_input (T_MFW_HND parent_win, T_CHINESE_DATA* chinese_data, SHORT kc)
{
    T_MFW_HND   win;
	//MfwEdt *edit = ((MfwHdr *) myHandle)->data;

    win = chinese_input_create (parent_win);
    if ( win NEQ NULL )
    {
        //SEND_EVENT (win, CHINESE_INPUT_INIT, 0, chinese_data);
        SEND_EVENT (win, CHINESE_INPUT_INIT, kc, chinese_data);
    }
    return win;
}


/*******************************************************************************

 $Function:    	chinese_input_create

 $Description:	
 
 $Returns:		Dialogue info win

 $Arguments:	parent win
 
*******************************************************************************/
static T_MFW_HND chinese_input_create (T_MFW_HND parent_win)
{
    T_MFW_WIN     *  win_data;
    T_chinese_input  *  data = (T_chinese_input *)ALLOC_MEMORY (sizeof (T_chinese_input));

    //TRACE_EVENT ("chinese_input_create()");

    data->input_win = win_create (parent_win, 0, E_WIN_VISIBLE, (T_MFW_CB)chinese_input_win_cb);
    if ( data->input_win EQ 0 )
        return 0;
    /* Create window handler */
    data->mmi_control.dialog    = (T_DIALOG_FUNC)chinese_input_exec;
    data->mmi_control.data      = data;
    data->parent_win            = parent_win;
    win_data                    = ((T_MFW_HDR *)data->input_win)->data;
    win_data->user              = (void *)data;
    /*return window handle */
    return data->input_win;
}


/*******************************************************************************

 $Function:    	chinese_input_destroy

 $Description:	Destruction of an information dialog
 
 $Returns:		void

 $Arguments:	win
 
*******************************************************************************/
void chinese_input_destroy (T_MFW_HND own_window)
{
    T_MFW_WIN     * win  = ((T_MFW_HDR *)own_window)->data;
    T_chinese_input  * data = (T_chinese_input *)win->user;
    //TRACE_EVENT ("chinese_input_destroy()");
    /* 2003/11/10 sunsj */
    T_MFW_HND     parent_win         = mfw_parent (own_window);
    T_MFW_WIN     * parent_win_data  = ((T_MFW_HDR *)parent_win)->data;
    T_EDITOR_INFO * parent_data      = (T_EDITOR_INFO *)parent_win_data->user;
    MfwHdr *edit_hdr = (MfwHdr *)parent_data->edt_edt;
    MfwEdt *edit_controll = (MfwEdt *)edit_hdr->data;

    if ( data )
    {
        /* 2003/11/1 sunsj */
        if ( data->Ime.pTextBuffer == NULL )
            return;

        if ( data->Ime.pTextBuffer[0] )
        {
            //UnicodeConver((USHORT*)data->Ime.pTextBuffer, (USHORT*)data->Ime.pTextBuffer);
			/* 2003/11/27 sunsj */
            memcpy(&data->Callback_Data.TextString[1], chinese_input_buffer, TEXT_BUFFER_EDIT_SIZE);
            /* 2003/11/10 sunsj add text cursor */
            edit_controll->cp = data->Ime.TextCursor;
        }
        /* Exit TIMER & KEYBOARD Handle */
        kbd_delete (data->input_kbd);
        /* Delete WIN Handler */
        win_delete (data->input_win);
        /* Free Memory */
        FREE_MEMORY ((void *)data, sizeof (T_chinese_input));
    }
}


/*******************************************************************************

 $Function:    	chinese_input

 $Description:	

 $Returns:		void

 $Arguments:	win, window handle event, value, parameter

*******************************************************************************/
void chinese_input_exec (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
    T_MFW_WIN       * win_data      = ((T_MFW_HDR *)win)->data;
    T_chinese_input * data          = (T_chinese_input *)win_data->user;
    T_CHINESE_DATA  * chinese_data  = (T_CHINESE_DATA *)parameter;
    T_EDIT_CB       Callback   = data->Callback_Data.Callback;
    T_MFW_HND       parent_win = data->parent_win;
    USHORT          Identifier = data->Callback_Data.Identifier;
    char debug[20];
    PZI8WCHAR       temp_ZiKeyMap;
    //TRACE_EVENT ("chinese_input_exec()");
    switch ( event )
    {
    case CHINESE_INPUT_INIT:
        data->Callback_Data = *chinese_data;
		/* 2003/11/27 sunsj */
        TEXT_BUFFER_EDIT_SIZE = (data->Callback_Data.EditorSize - 3);
		/* Initialize dialog */
        /* Create timer and keyboard handler */
        data->input_kbd = kbd_create (win, KEY_ALL, (T_MFW_CB)chinese_input_kbd_cb);
        /* Initialize all data structure and veriables to zero */
        memset(&data->Ime, 0, sizeof(data->Ime));
        //memset(&data->wszTextBuffer, 0, sizeof(data->wszTextBuffer));
        memset(&data->GetParam, 0, sizeof(data->Ime));
        memset(&data->wcCandidates, 0, sizeof(data->wcCandidates));
        memset(&data->HighlightedCandidate, 0, sizeof(data->HighlightedCandidate));
        memset(&data->CursorPosition, 0, sizeof(data->CursorPosition));
        memset(&data->DisplayElementBuffer, 0,sizeof(data->DisplayElementBuffer));
        data->StartOfDisplayIndex   = 0;
        data->NumberOfKeyPress      = 0;
        data->PerviousKeyPress      = -1;
        /* 2003/10/26 sunsj add for select input mode */
        editor_input_mode = chinese_data->InputMode;

        /* 2003/11/10 sunsj set text cursor */
        data->Ime.TextCursor = chinese_data->Cursor;

        /* Now intitialize the Zi8 Core Engine */
        Zi8Initialize();

        /* Now initialize the IME */
        /*
        memset(chinese_input_buffer, 0x0000, 70);
        memcpy(chinese_input_buffer, &data->Callback_Data.TextString[1], 140);
                */

        if ( (data->Callback_Data.TextString[0] & 0x80) != 0 )
        {
            data->Callback_Data.TextString[0] = 0x80;
            //data->wszTextBuffer = (PZI8WCHAR)(data->Callback_Data.TextString+1); //ignore first char (Unicode marker)		
            data->wszTextBuffer = chinese_input_buffer;

            /* 2003/11/27 sunsj */
            memset(chinese_input_buffer, 0x00, 140);
            memcpy(chinese_input_buffer, &data->Callback_Data.TextString[1], TEXT_BUFFER_EDIT_SIZE-3);
        }
        else
        {
            int i=0;

            while ( data->Callback_Data.TextString[i] )
            {
                i++;
            }

            data->wszTextBuffer = chinese_input_buffer;
            //data->wszTextBuffer++;

            /* 2003/11/27 sunsj convert ascii to unicode */
            for ( ; i>0; i-- )
            {
                data->Callback_Data.TextString[i*2] = data->Callback_Data.TextString[i-1];
                data->Callback_Data.TextString[i*2-1] = 0x00;
            }
            data->Callback_Data.TextString[0] = 0x80;

            /* 2003/11/27 sunsj */
            memset(chinese_input_buffer, 0x00, 140);
            memcpy(chinese_input_buffer, &data->Callback_Data.TextString[1], TEXT_BUFFER_EDIT_SIZE);
        }

        IMEInitialize(&data->Ime, &data->GetParam, data->wszTextBuffer, TEXT_BUFFER_EDIT_SIZE,
                      sizeof(data->wszTextBuffer), data->wcCandidates, data->wszElementBuffer, data->DisplayElementBuffer);

        /* Store any other data */
        /* 2003/10/13 sunsj/ the first key press */
        switch ( value )
        {
        case KCD_8:
            switch ( data->Ime.EditorMode )
            {
            case STROKE_INPUT_MODE:
                data->Ime.InputScreenType = STROKE_INPUT_SCREEN;
                IMEMore(&data->Ime);
                data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
                winShow(win);
                break;
            case PINYIN_INPUT_MODE:
                data->Ime.InputScreenType = PINYIN_INPUT_SCREEN;

                temp_ZiKeyMap = (PZI8WCHAR )ZiPinYinKeyMap[value-1];

                Zi_onekey_keypress(&data->Ime, temp_ZiKeyMap);

                /* due to not able to receive key press count, it is assume the first letter assign to the key is selected when key */
                /* is pressed.																					   */
                data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
                winShow(win);
                break;
            default:
                break;
            }
            break;
        case KCD_1:
            switch ( data->Ime.EditorMode )
            {
            case STROKE_INPUT_MODE:
                data->Ime.InputScreenType = STROKE_INPUT_SCREEN;
                IMEKeyPress( &data->Ime, (ZI8WCHAR) (ZiStrokeKeyMap[value][1] + ZI8_BASE_STROKES) );
                data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
                winShow(win);
                break;
            case PINYIN_INPUT_MODE:
                {
                    int candidate_num;
                    /* 2003/11/1 sunsj */
                    data->Ime.InputScreenType = WORD_ASSOCIATION_SCREEN;
                    data->Ime.pGetParam->ElementCount = 1;
                    data->Ime.pGetParam->pElements[data->Ime.pGetParam->ElementCount-1] = ZI8_CODE_MORE;

                    data->Ime.pGetParam->FirstCandidate = data->Ime.moreCount * CANDIDATES_PER_GROUP;
                    data->Ime.pGetParam->MaxCandidates = 2 * CANDIDATES_PER_GROUP;
                    data->Ime.candidates = Zi8GetCandidates(data->Ime.pGetParam);


                    if ( data->Ime.candidates > 0 )
                    {
                        /* Convert the data storage format for display purpose */
                        DataConvert(&data->Ime);
                        /* initialize the candidate cursor to zero */
                        data->Ime.CandidateCursor = 0;
                    }

⌨️ 快捷键说明

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