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

📄 asix_key.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
/*************************************************************************
*
* Copyright  2000 National ASIC Center, All right Reserved
*
* FILE NAME: asix_key.c
* PROGRAMMER: Jinjing
* Date of Creation: 2001/11/21
* 
* DESCRIPTION: The operation about KeyBar. Include the
*				create, destory, trans, proc, repaint.
*
* NOTE: 
* 
* FUNCTIONS LIST:
* -------------------------------------------------------------------------
* STATUS	kb_create(char *caption,U32 style,U16 x,U16 y,U16 width,U16 height,U32 wndid,U32 menu,void **ctrl_str,void *exdata)
* STATUS	kb_msgtrans(void *ctrl_str,U16 msg_type,U32 areaId,P_U16 data,U32 size,PMSG trans_msg)
* STATUS	kb_msgproc(U16 asix_msg,U32 lparam,void *data,U16 wparam,void *reserved)
* STATUS	kb_destroy(void *ctrl_str)
* STATUS	kb_repaint(void *ctrl_str, U32 lparam)
* 
* 	
**************************************************************************
* MODIFICATION HISTORY
*
* 2001/11/21 by Jinjing Creation of this file
* 2002/03/15 by Jinjing add the function of :	kb_repaint
* 2002/03/26 by Jinjing add the function of :	full screen handwriting
*************************************************************************/ 
#include <string.h>

#include "asixwin.h"
#include "asixapp.h"
#include "asix_key.h"
#include "asixdbg.h"

#include "TuBiao.h"

#include "gpc.h"

const char Key0[]={' ','.','!','"',',','?',':',';','<','>'};
const char Key1[]={'@','&','$','%','(',')','[',']','{','}'};
const char Key2[]={'A','B','C'};
const char Key3[]={'D','E','F'};
const char Key4[]={'G','H','I'};
const char Key5[]={'J','K','L'};
const char Key6[]={'M','N','O'};
const char Key7[]={'P','Q','R','S'};
const char Key8[]={'T','U','V'};
const char Key9[]={'W','X','Y','Z'};
const char Keya[]={'+','-','*','/','='};
const char Keyb[]={'#','`','^','_','|'};

//STATIC void DrawBox(U16 xSrc,U16 ySrc,U16 xDest,U16 yDest);
PUBLIC STATUS	kb_create(char *caption,U32 style,U16 x,U16 y,U16 width,U16 height,U32 wndid,U32 menu,void **ctrl_str,void *exdata);
PUBLIC STATUS	kb_msgtrans(void *ctrl_str,U16 msg_type,U32 areaId,P_U16 data,U32 size,PMSG trans_msg);
PUBLIC STATUS	kb_msgproc(U32 win_id, U16 asix_msg,U32 lparam,void *data,U16 wparam,void *reserved);
PUBLIC STATUS	kb_destroy(void *ctrl_str);
STATIC void KeyTimerOutProcess( kb_ctrl *kbctrl );
U16 ProcessBig( kb_ctrl *kbctrl );                   //this is a function ,only used in this c file.
U16 ProcessSmall( kb_ctrl *kbctrl );                 //this is a function ,only used in this c file.
U16 PenSelect( U32 areaId,kb_ctrl *kbctrl );         //this is a function ,only used in this c file.
void DisplayStatus( kb_ctrl *kbctrl );               //this is a function ,only used in this c file.
void DisplayText( kb_ctrl *kbctrl,U8 n );            //this is a function ,only used in this c file.
void Suspend( kb_ctrl *kbctrl );                     //this is a function ,only used in this c file.
void Enable( kb_ctrl *kbctrl,U8 n );                 //this is a function ,only used in this c file.

#define DrawBox(xSrc,ySrc,xDest,yDest) \
DrawRec(GetGC(),GPC_BLACK,xSrc,ySrc,xDest,yDest,GPC_SOLID_LINE,GPC_REPLACE_STYLE)
/*
static void	DrawBox(U16 xSrc,U16 ySrc,U16 xDest,U16 yDest)
{
	U32		pGC;

	pGC =GetGC();
	DrawRec( pGC,GPC_BLACK,xSrc,ySrc,xDest,yDest,GPC_SOLID_LINE,GPC_REPLACE_STYLE);
}
*/

STATUS	kb_create(char *caption,U32 style,U16 x,U16 y,U16 width,U16 height,U32 wndid,U32 menu,void **ctrl_str,void *exdata)
{
	kb_ctrl *kbctrl;
	U16		lcdh,lcdw;
	U32		pGC;

	lcdh=ASIX_LCD_H;
	lcdw=ASIX_LCD_W;
	if ( (x+width)>lcdw || (y+height)>lcdh ) return ASIX_ERROR;//check these parameters	
	if( width < KEYBAR_MIN_WIDTH || height < KEYBAR_MIN_HEIGHT )
		return ASIX_ERROR;

	kbctrl=(kb_ctrl *)Lcalloc( sizeof(kb_ctrl) );
	if (kbctrl == NULL ) return ASIX_NO_MEM;

	pGC =GetGC();
	
	kbctrl->pGC=pGC;
	kbctrl->classid=(U32)WNDCLASS_KEYBAR;
	kbctrl->windowid=wndid;
	kbctrl->style=style;
	kbctrl->x=x;
	kbctrl->y=y;
	kbctrl->width=width;
	kbctrl->height=height;
	kbctrl->boxw=REGION_WIDTH;
	kbctrl->prekey=0xffff;
	kbctrl->curkey=0;
	kbctrl->funckey=0;
	kbctrl->keycount=0;
	kbctrl->tabflag=0;
	kbctrl->pretabflag=0;
	kbctrl->handwritingflag=0;
	kbctrl->select=0;
	kbctrl->open=0;

	if ( style & WS_SAVESCREEN )//this will not be executed!!
	{
//		kbctrl->kb_coveredmap=(U16 *)Lcalloc(width * height * 2);
		kbctrl->kb_coveredmap=(U16 *)GetBlock( width, height );
		if (kbctrl->kb_coveredmap == NULL)
		{
			Lfree ( (P_VOID)kbctrl);
			return ASIX_NO_MEM;
		}
		SaveRec( pGC,kbctrl->kb_coveredmap,x,y,width,height,0);
	}
	ClearRec( pGC,GPC_WHITE,x,y,width,height,GPC_REPLACE_STYLE);

	if( ( ActiveAreaEnable( (P_U32)&(kbctrl->pre_id),ICON_AREA,CONTINUOUS_MODE,x+1,y+1,x+8,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) ||
	( ActiveAreaEnable( (P_U32)&(kbctrl->next_id),ICON_AREA,CONTINUOUS_MODE,x+10,y+1,x+17,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) ||
	( ActiveAreaEnable( (P_U32)&(kbctrl->figure[0]),ICON_AREA,CONTINUOUS_MODE,x+19,y+1,x+18+kbctrl->boxw,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) ||
	( ActiveAreaEnable( (P_U32)&(kbctrl->figure[1]),ICON_AREA,CONTINUOUS_MODE,x+18+kbctrl->boxw+1,y+1,x+18+kbctrl->boxw*2,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) ||
	( ActiveAreaEnable( (P_U32)&(kbctrl->figure[2]),ICON_AREA,CONTINUOUS_MODE,x+18+kbctrl->boxw*2+1,y+1,x+18+kbctrl->boxw*3,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) ||
	( ActiveAreaEnable( (P_U32)&(kbctrl->figure[3]),ICON_AREA,CONTINUOUS_MODE,x+18+kbctrl->boxw*3+1,y+1,x+18+kbctrl->boxw*4,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) ||
	( ActiveAreaEnable( (P_U32)&(kbctrl->figure[4]),ICON_AREA,CONTINUOUS_MODE,x+18+kbctrl->boxw*4+1,y+1,x+18+kbctrl->boxw*5,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) ||
//	( ActiveAreaEnable( (P_U32)&(kbctrl->tab_id),ICON_AREA,CONTINUOUS_MODE,x+18+kbctrl->boxw*5+3,y+1,117,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) )
	( ActiveAreaEnable( (P_U32)&(kbctrl->tab_id),ICON_AREA,CONTINUOUS_MODE,x+kbctrl->width-27,y+1,x+kbctrl->width-1,y+kbctrl->boxw,kbctrl->windowid ) != PPSM_OK ) )
		 goto ErrHandle;
		 
	Suspend( kbctrl );//suspend kbctrl->figure[0]-[4]
	
	//DrawBox((U16)(x+1),(U16)(y+1),(U16)(x+8),(U16)(y+kbctrl->boxw));//draw the button
	//DrawBox((U16)(x+10),(U16)(y+1),(U16)(x+17),y+kbctrl->boxw);//draw the button
	//DrawBox((U16)(x+18+kbctrl->boxw*5+3),(U16)(y+1),117,y+kbctrl->boxw);//draw the button
	
	//TextOut(pGC,"P",x+2,y+2,0,GPC_BLACK,GPC_REPLACE_STYLE);
	//TextOut(pGC,"N",x+11,y+2,0,GPC_BLACK,GPC_REPLACE_STYLE);
	//TextOut(pGC,"数字",x+18+kbctrl->boxw*5+4,y+2,0,GPC_BLACK,GPC_REPLACE_STYLE);

	PutRec(pGC, left, x+1, y+1, 8, 14, GPC_REPLACE_STYLE, 0);
	PutRec(pGC, right, x+10, y+1, 8, 14, GPC_REPLACE_STYLE, 0);

	// longn_qi 2002/04/05 revised for auto-adapt to window width.
//	PutRec(pGC, shuzi, x+18+kbctrl->boxw*5+3, y+1, 26, 14, GPC_REPLACE_STYLE, 0);
	PutRec(pGC, shuzi, x+width-27, y+1, 26, 14, GPC_REPLACE_STYLE, 0);

	DrawRec( pGC,GPC_BLACK,x,y,x+width-1,y+height-1,GPC_SOLID_LINE,GPC_REPLACE_STYLE);//draw the border of the whole window
	
	CreateTimer( &( kbctrl->timerId ),1000,KeyTimerOutProcess,( kb_ctrl* )kbctrl,0 );

	*ctrl_str=(void *)kbctrl;
	return ASIX_OK;

ErrHandle:
	if (kbctrl->next_id!=0) ActiveAreaDisable(kbctrl->next_id);
	if (kbctrl->pre_id!=0) ActiveAreaDisable(kbctrl->pre_id);
	if (kbctrl->figure[0]!=0) ActiveAreaDisable(kbctrl->figure[0]);
	if (kbctrl->figure[1]!=0) ActiveAreaDisable(kbctrl->figure[1]);
	if (kbctrl->figure[2]!=0) ActiveAreaDisable(kbctrl->figure[2]);
	if (kbctrl->figure[3]!=0) ActiveAreaDisable(kbctrl->figure[3]);
	if (kbctrl->figure[4]!=0) ActiveAreaDisable(kbctrl->figure[4]);
	if (kbctrl->tab_id!=0) ActiveAreaDisable(kbctrl->tab_id);
	if (kbctrl->kb_coveredmap != NULL)
	{
		PutRec( pGC,kbctrl->kb_coveredmap,x,y,width,height,GPC_REPLACE_STYLE,0);
		Lfree(kbctrl->kb_coveredmap);
	}
	FreeTimer( kbctrl->timerId );
	ClearRec( pGC,GPC_WHITE,kbctrl->x,kbctrl->y,kbctrl->width,kbctrl->height,GPC_REPLACE_STYLE );
	Lfree(kbctrl);
	return ASIX_ERROR;
}

STATUS	kb_msgtrans(void *ctrl_str,U16 msg_type,U32 areaId,P_U16 data,U32 size,PMSG trans_msg)
{
	register kb_ctrl *kbctrl;
	U32		pGC;

	kbctrl=(kb_ctrl *)ctrl_str;
	pGC=kbctrl->pGC;

	if( ((ASIX_WINDOW *)GetFocus( ))->wndclass->wndclass_id != WNDCLASS_EDITOR )
		return ASIX_NO_MSG;
	if ( msg_type != ASIX_ICON && msg_type != ASIX_CHINESE && msg_type != ASIX_KEY )
		return ASIX_NO_MSG;
	if (kbctrl==NULL || trans_msg==NULL)
		return ASIX_ERROR;

	trans_msg->messageType=ASIX_MESSAGE;	//the type of all the ASIX win messages are ASIX_MESSAGE

	switch( msg_type )
	{		case ASIX_ICON:
			if ( areaId == kbctrl->next_id ) {
				kbctrl->areaselect=KB_NEXT;
			} else if ( areaId == kbctrl->pre_id ) {
				kbctrl->areaselect=KB_PRE;
			} else if ( areaId == kbctrl->figure[0] ) {
				kbctrl->areaselect=KB_FIGURE0;
			} else if ( areaId == kbctrl->figure[1] ) {
				kbctrl->areaselect=KB_FIGURE1;
			} else if ( areaId == kbctrl->figure[2] ) {
				kbctrl->areaselect=KB_FIGURE2;
			} else if ( areaId == kbctrl->figure[3] ) {
				kbctrl->areaselect=KB_FIGURE3;
			} else if ( areaId == kbctrl->figure[4] ) {
				kbctrl->areaselect=KB_FIGURE4;
			} else if ( areaId == kbctrl->tab_id ) {
				kbctrl->areaselect=KB_TAB;
			} else
				return ASIX_NO_MSG;
			//if( kbctrl->tabflag%4 == 3 && kbctrl->handwritingflag == 0 && ( areaId == kbctrl->next_id || areaId == kbctrl->pre_id ) )
			/*if( kbctrl->tabflag%4 == 3 && kbctrl->handwritingflag == 0 && areaId == kbctrl->next_id )
			{
				//SaveRec(pGC,kbctrl->kb_coveredmap1,1,90,118,53,0 );//add by DSA 2002.03.22
				SysAdvOpenInputPad( &( kbctrl->areaId ),kbctrl->windowid,kbctrl->kb_coveredmap1,1,90,1,1,118,53,GPC_RED,GPC_NORM_WIDTH );
			}
			if( kbctrl->tabflag%4 == 3 && kbctrl->handwritingflag == 0 && areaId == kbctrl->pre_id )
			{
				SysSaveInputPad( kbctrl->areaId );
				SysClearAndDrawInputPad( kbctrl->areaId );
				//SaveRec(pGC,kbctrl->kb_coveredmap1,1,90,118,53,0 );
				//ClearRec(pGC,GPC_WHITE,1,90,118,53,GPC_REPLACE_STYLE);
				//DrawRec(pGC,GPC_BLUE,1,90,118,53,GPC_SOLID_LINE,GPC_REPLACE_STYLE);
				//SaveRec(pGC,kbctrl->kb_coveredmap1,1,90,118,53,0 );//add by DSA 2002.03.22
				//SysAdvOpenInputPad( &( kbctrl->areaId ),kbctrl->windowid,1,90,1,1,118,53,GPC_RED,GPC_NORM_WIDTH );
			}*/
			trans_msg->lparam=kbctrl->windowid;
			trans_msg->data=(void *)kbctrl;
			trans_msg->wparam=(U16)WNDCLASS_KEYBAR;

//			if ( *data == PPSM_ICON_TOUCH ) //trans_msg->message=WM_PENDOWN;
			if ( size == PPSM_ICON_TOUCH ) //trans_msg->message=WM_PENDOWN;
			{
				trans_msg->message=WM_PENDOWN;
				if( kbctrl->tabflag%4 == 3 && kbctrl->handwritingflag == 0 && areaId == kbctrl->next_id )
				{
					//SaveRec(pGC,kbctrl->kb_coveredmap1,1,90,118,53,0 );//add by DSA 2002.03.22
					StopCursor(pGC);
//					if( kbctrl->areaId == NULL )
//						SysAdvOpenInputPad( &( kbctrl->areaId ),kbctrl->windowid,1,17,1,1,118,126,GPC_RED,GPC_NORM_WIDTH );
//					else
//					{
//						SysSaveInputPad( kbctrl->areaId );
						SysActiveAreaSuspend(kbctrl->areaId,AREA_REENABLE);
//					}
					/*if( ((ATV *)(kbctrl->areaId))->extptr->pad == INPUTPADOPEN )
					{
						SysSaveInputPad( kbctrl->areaId );
						SysActiveAreaSuspend(kbctrl->areaId,AREA_REENABLE);
					}
					else
						SysAdvOpenInputPad( &( kbctrl->areaId ),kbctrl->windowid,1,17,1,1,118,126,GPC_RED,GPC_NORM_WIDTH );*/
				}
				/*if( kbctrl->tabflag%4 == 3 && kbctrl->handwritingflag == 0 && areaId == kbctrl->pre_id )
				{
					StopCursor(pGC);
					SysSaveInputPad( kbctrl->areaId );
					//SysClearAndDrawInputPad( kbctrl->areaId );
					SysActiveAreaSuspend(kbctrl->areaId,AREA_REENABLE);
					//SaveRec(pGC,kbctrl->kb_coveredmap1,1,90,118,53,0 );
					//ClearRec(pGC,GPC_WHITE,1,90,118,53,GPC_REPLACE_STYLE);
					//DrawRec(pGC,GPC_BLUE,1,90,118,53,GPC_SOLID_LINE,GPC_REPLACE_STYLE);
					//SaveRec(pGC,kbctrl->kb_coveredmap1,1,90,118,53,0 );//add by DSA 2002.03.22
					//SysAdvOpenInputPad( &( kbctrl->areaId ),kbctrl->windowid,1,90,1,1,118,53,GPC_RED,GPC_NORM_WIDTH );
				}*/
			}
//			else if ( *data == PPSM_ICON_DRAG ) trans_msg->message=WM_PENDRAG;
//			else if ( *data == PPSM_ICON_DRAG_UP ) trans_msg->message=WM_PENDRAGUP;
//			else if ( *data == PPSM_ICON_PEN_UP ) trans_msg->message=WM_PENUP;
			else if ( size == PPSM_ICON_DRAG ) trans_msg->message=WM_PENDRAG;
			else if ( size == PPSM_ICON_DRAG_UP ) trans_msg->message=WM_PENDRAGUP;
			else if ( size == PPSM_ICON_PEN_UP ) trans_msg->message=WM_PENUP;
			break;
			
		case ASIX_CHINESE:
			memcpy( kbctrl->chinese,data,20 );
			kbctrl->handwritingflag=1;
			kbctrl->open=1;
			DisplayText( kbctrl,0 );

⌨️ 快捷键说明

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