📄 asix_key.c
字号:
/*************************************************************************
*
* 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 + -