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

📄 keyborde.c

📁 基于microwindow的keyboard
💻 C
字号:
#include "keyborde.h"GR_IMAGE_ID loadimage(char *image_path){    GR_IMAGE_ID image_id;    if(!(image_id = GrLoadImageFromFile(image_path, 0)))     {	fprintf(stderr, "Failed to load image file \"%s\"\n", image_path);	exit;    }    return image_id;}/**************************** main program ****************************************/char *keyborde(){    GR_EVENT	event;    if (GrOpen() < 0)     {	fprintf(stderr, "cannot open graphics\n");	exit(1);    }/**************************** font infomation *************************************/    regFont=GrCreateFont(GR_FONT_SYSTEM_FIXED,12, NULL);    GrSetFontSize   (regFont,20);    GrGetFontInfo(regFont, &fif);    winw = 50*FONW;//display 80 chars;    wifi_keyborde_inputdisplay_gc = GrNewGC();    GrSetGCForeground(wifi_keyborde_inputdisplay_gc,BLACK);    GrSetGCUseBackground(wifi_keyborde_inputdisplay_gc,GR_FALSE);    GrSetGCFont(wifi_keyborde_inputdisplay_gc ,regFont); /**************************** images infomation ***********************************/    keyborde_backimage = loadimage(BINPATH"/ico/keyborde.jpg");    key_down_image = loadimage(BINPATH"/ico/key_down.jpg");    key_up_image = loadimage(BINPATH"/ico/key_up.jpg");    led_image = loadimage(BINPATH"/ico/led.jpg");    GrGetImageInfo(keyborde_backimage, &iif_keyborde_backimage);    GrGetImageInfo(key_down_image, &iif_key_down_image);    GrGetImageInfo(key_up_image, &iif_key_up_image);    wifi_keyborde_wid = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE|GR_WM_PROPS_NOBACKGROUND, "keyborde", 				      GR_ROOT_WINDOW_ID,KEYBORDE_X,KEYBORDE_Y,KEYBORDE_WIDTH,				      KEYBORDE_HEIGHT, GrGetSysColor(GR_COLOR_WINDOW));    pid_keyborde = GrNewPixmap(5*BUTTON_WIDTH, BUTTON_HEIGHT, NULL);//the region where images in;        keyborde_gc = GrNewGC();    keyborde_text_gc = GrNewGC();     pid_copy_gc = GrNewGC();    GrSetGCUseBackground(keyborde_gc,GR_FALSE);    GrSetGCForeground(keyborde_text_gc,BLACK);    GrSetGCUseBackground(keyborde_text_gc,GR_FALSE);    GrSetGCBackground(pid_copy_gc,WHITE);    GrDrawImageToFit(pid_keyborde,pid_copy_gc,BUTTON_WIDTH,0,BUTTON_WIDTH,BUTTON_HEIGHT,		     key_down_image);    GrDrawImageToFit(pid_keyborde,pid_copy_gc,4*BUTTON_WIDTH,0,BUTTON_WIDTH,BUTTON_HEIGHT,		     key_up_image);    GrDrawImageToFit(pid_keyborde,pid_copy_gc,2*BUTTON_WIDTH,0,163.0/800*KEYBORDE_WIDTH,		     71.0/479*KEYBORDE_HEIGHT,led_image);    GrFreeImage(led_image);    GrFreeImage(key_up_image);    GrFreeImage(key_down_image);    GrSelectEvents(wifi_keyborde_wid, GR_EVENT_MASK_EXPOSURE		   |GR_EVENT_MASK_BUTTON_UP		   |GR_EVENT_MASK_BUTTON_DOWN		   |GR_EVENT_MASK_CLOSE_REQ);    GrMapWindow(wifi_keyborde_wid);        while (1)     {	GrGetNextEvent(&event);	switch (event.type) 	{	    case GR_EVENT_TYPE_EXPOSURE:		do_exposure(&event.exposure);		break;			    case GR_EVENT_TYPE_BUTTON_DOWN:	    case GR_EVENT_TYPE_BUTTON_UP:		//	GrFlush();		do_button(&event.button);		if(!flag_save)		    break;			//printf("int ok !\n");	    case GR_EVENT_TYPE_CLOSE_REQ:		GrDestroyFont(regFont);		GrDestroyGC(keyborde_gc);		GrDestroyGC(keyborde_text_gc);		GrDestroyGC(pid_copy_gc);		GrDestroyGC(wifi_keyborde_inputdisplay_gc);		GrDestroyWindow(pid_keyborde);		GrDestroyWindow(wifi_keyborde_wid);		GrClose();	    	printf("$$$$$:%s\n",keyborde_input_sbuf);		return (keyborde_input_sbuf);			//printf("erererer\n");		//exit(0);	}    }	}static void do_exposure(GR_EVENT_EXPOSURE *ep){    if(ep->wid == wifi_keyborde_wid)    {	GrDrawImageToFit(wifi_keyborde_wid, keyborde_gc, 0, 0, iif_keyborde_backimage.width/800*KEYBORDE_WIDTH, 			 iif_keyborde_backimage.height/479*KEYBORDE_HEIGHT, keyborde_backimage);	GrFreeImage(keyborde_backimage);	GrCopyArea(wifi_keyborde_wid,pid_copy_gc,0,8.0/479*KEYBORDE_HEIGHT,36*3.0/800*KEYBORDE_WIDTH,		   20.0/479*KEYBORDE_HEIGHT,pid_keyborde,2*BUTTON_WIDTH+42.0/800*KEYBORDE_WIDTH,		   44.0/479*KEYBORDE_HEIGHT,0);	GrCopyArea(wifi_keyborde_wid,pid_copy_gc,705.0/800*KEYBORDE_WIDTH,7.0/479*KEYBORDE_HEIGHT,		   53.0/800*KEYBORDE_WIDTH,39.0/479*KEYBORDE_HEIGHT,pid_keyborde,2*BUTTON_WIDTH,0,0);	drawkey(10.0/800*KEYBORDE_WIDTH,93.0/479*KEYBORDE_HEIGHT,4,1,0);	drawkey(110.0/800*KEYBORDE_WIDTH,93.0/479*KEYBORDE_HEIGHT,28,7,4);	drawkey(698.0/800*KEYBORDE_WIDTH,93.0/479*KEYBORDE_HEIGHT,4,1,32);    }}static void drawkey(int x,int y,int count,int row_count,int k){    int i=0;    int row=0;    int px,py;	for(;i<count;i++)	{	    if((i%row_count)==0&&i!=0)		row++;printf("eow=%d\n",row);	    GrCopyArea(wifi_keyborde_wid,pid_copy_gc,x+(i-row_count*row)*BUTTON_WIDTH,		       y+row*BUTTON_HEIGHT,BUTTON_WIDTH,BUTTON_HEIGHT,pid_keyborde,4*BUTTON_WIDTH,0,0);	    px=x+(i-row_count*row)*BUTTON_WIDTH-30.0/800*KEYBORDE_WIDTH;//$$	    py=y+row*BUTTON_HEIGHT-10.0/479*KEYBORDE_HEIGHT;//$$	    GrText(wifi_keyborde_wid,keyborde_text_gc,px+BUTTON_WIDTH/2,py+BUTTON_HEIGHT/2,		   key[i+k].key_name,-1,GR_TFASCII);	}}static void do_button(GR_EVENT_BUTTON *bt){    int k=0;    int i=0,j=0;        switch (bt->type)      {  	case GR_EVENT_TYPE_BUTTON_DOWN: 	    if((k=read_key_position(bt))<0)		return;	    printf("key\n");	    printf("px=%d  py=%d\n",image_x,image_y);	    	    GrCopyArea(pid_keyborde,pid_copy_gc,0,0,BUTTON_WIDTH,BUTTON_HEIGHT,wifi_keyborde_wid,image_x,image_y,0); 	    GrCopyArea(wifi_keyborde_wid,pid_copy_gc,image_x,image_y,BUTTON_WIDTH,BUTTON_HEIGHT,pid_keyborde,		       BUTTON_WIDTH,0,0);	    	    if(flag_num==1&&k>3&&k<32)//*$$		k=k+32;	    if(flag_c==1&&k>3&&k<32)		k=k+47;	    if(flag_caps==1&&k>3&&k<32)		k=k+75;	    	    GrText(wifi_keyborde_wid,keyborde_text_gc,image_x+BUTTON_WIDTH/2-30.0/800*KEYBORDE_WIDTH,		   image_y+BUTTON_HEIGHT/2-10.0/479*KEYBORDE_HEIGHT,key[k].key_name,-1,GR_TFASCII);	    GrGetNextEvent(bt);	    GrCopyArea(wifi_keyborde_wid,pid_copy_gc,image_x,image_y,BUTTON_WIDTH,BUTTON_HEIGHT,pid_keyborde,0,0,0);	    do_key(k);//key exec	    if(flag_save) 		return;//$$	    break; 		 	case GR_EVENT_TYPE_BUTTON_UP:  	    break;     }     }static int read_key_position(GR_EVENT_BUTTON *bt){    int px=10.0/800*KEYBORDE_WIDTH,py=93.0/479*KEYBORDE_HEIGHT;    int k=0;    int key_no=0;    int row_x=0,row_y=0;/********************************save_button down*****************************************************/    if((bt->x>705.0/800*KEYBORDE_WIDTH&&bt->x<760.0/800*KEYBORDE_WIDTH)&&       (bt->y>7.0/479*KEYBORDE_HEIGHT&&bt->y<46.0/479*KEYBORDE_HEIGHT))    {	GrCopyArea(wifi_keyborde_wid,pid_copy_gc,705.0/800*KEYBORDE_WIDTH,7.0/479*KEYBORDE_HEIGHT,		   53.0/800*KEYBORDE_WIDTH,39.0/479*KEYBORDE_HEIGHT,pid_keyborde,		   2*BUTTON_WIDTH+54.0/800*KEYBORDE_WIDTH,0,0);	flag_save=1;	return -1;    }/***************************************************************************************/    if(bt->x<px||((bt->x>px+BUTTON_WIDTH)&&(bt->x<110.0/800*KEYBORDE_WIDTH))||       (bt->x>(110.0/800*KEYBORDE_WIDTH+8*BUTTON_WIDTH)))	return -1;    if(bt->y<py||bt->y>(py+4*BUTTON_HEIGHT))	return -1;    for(k=0;;k++)    {	if(bt->x<=px+BUTTON_WIDTH)	    break;	if(k==0)	    px=px+16.0/800*KEYBORDE_WIDTH;		if(bt->x>px+BUTTON_WIDTH)	{	    px=px+BUTTON_WIDTH;	    row_x++;	}    }    for(k=0;;k++)    {	if(bt->y<=py+BUTTON_HEIGHT)	    break;	else	{	    py=py+BUTTON_HEIGHT;	    row_y++;	}    }    image_x=px;    image_y=py;    if(row_x==0)	key_no=row_y;    if(row_x>0&&row_x<8)	key_no=3+row_y*7+row_x;    if(row_x==8)	key_no=32+row_y;        if(flag_num==1&&key_no>18&&key_no<32)	return -1;    if(flag_c==1&&key_no>31&&key_no<32)	return -1;    if(flag_caps==1&&key_no>29&&key_no<32)	return -1;    return (key_no);}static void do_key(int k){    int i=0;    switch(k)    {	case 0:	    flag_save=-1;	    return;	    	case 1:	    if (flag_num==0)	    {		flag_num=1;		flag_c=0;		flag_caps=0;	    }	    else	    {		flag_num=0;	    }	    flag_chang();	    break;	    	case 2:	    if (flag_c==0)	    {		flag_c=1;		flag_num=0;		flag_caps=0;	    }	    else	    {		flag_c=0;	    }	    flag_chang();	    break;	    	case 3:	    if (flag_caps==0)	    {		flag_caps=1;		flag_num=0;		flag_c=0;	    }	    else	    {		flag_caps=0;	    }	    flag_chang();	    break;	case 32:	    printf("backspace\n");	    if(curx>0)	    {		GrCopyArea(wifi_keyborde_wid,pid_copy_gc,125.0/800*KEYBORDE_WIDTH+curx*FONW,			   8.0*KEYBORDE_HEIGHT/479,FONW,39.0/479*KEYBORDE_HEIGHT,pid_keyborde,			   2*BUTTON_WIDTH+110.0/800*KEYBORDE_WIDTH,0,0);		curx--;		keyborde_input_sbuf[curx]='\0';		printf("%s",keyborde_input_sbuf);	    }	    break;	case 33:	    flag_save=-1;	    return;	    break;	default:	    if(curx<(CHAR_COUNT*KEYBORDE_WIDTH/800-1))	    {		keyborde_input_sbuf[curx++]=key[k].asc_no;		keyborde_input_sbuf[curx]='\0';	    }	    else	    {		keyborde_input_sbuf[curx-1] = key[k].asc_no;		GrCopyArea(wifi_keyborde_wid,pid_copy_gc,125.0/800*KEYBORDE_WIDTH+curx*FONW,			   8.0*KEYBORDE_HEIGHT/479,FONW,39.0/479*KEYBORDE_HEIGHT,pid_keyborde,			   2*BUTTON_WIDTH+110.0/800*KEYBORDE_WIDTH,0,0);	    }	    GrText(wifi_keyborde_wid,wifi_keyborde_inputdisplay_gc,125.0/800*KEYBORDE_WIDTH+curx*FONW,		   30.0/479*KEYBORDE_HEIGHT,&keyborde_input_sbuf[curx-1],-1,GR_TFASCII);    }}static void flag_chang(){    GrFillRect(wifi_keyborde_wid,pid_copy_gc,110.0/800*KEYBORDE_WIDTH,93.0/479*KEYBORDE_HEIGHT,	       7*BUTTON_WIDTH,4*BUTTON_HEIGHT);//clear keyborde    GrCopyArea(wifi_keyborde_wid,pid_copy_gc,0,8.0/479*KEYBORDE_HEIGHT,36*3.0/800*KEYBORDE_WIDTH,	       20.0/479*KEYBORDE_HEIGHT,pid_keyborde,2*BUTTON_WIDTH+42.0/800*KEYBORDE_WIDTH,	       44.0/479*KEYBORDE_HEIGHT,0);    if(flag_num)    {	GrCopyArea(wifi_keyborde_wid,pid_copy_gc,0,8.0/479*KEYBORDE_HEIGHT,36.0/800*KEYBORDE_WIDTH,		   20.0/479*KEYBORDE_HEIGHT,pid_keyborde,2*BUTTON_WIDTH,44.0/479*KEYBORDE_HEIGHT,0);//draw flag	drawkey(110.0/800*KEYBORDE_WIDTH,93.0/479*KEYBORDE_HEIGHT,15,7,36);//draw numborde	    }    else if(flag_c)    {	GrCopyArea(wifi_keyborde_wid,pid_copy_gc,36.0/800*KEYBORDE_WIDTH,8.0/479*KEYBORDE_HEIGHT,		   36.0/800*KEYBORDE_WIDTH,20.0/479*KEYBORDE_HEIGHT,pid_keyborde,2*BUTTON_WIDTH,		   44.0/479*KEYBORDE_HEIGHT,0);//draw flag	drawkey(110.0/800*KEYBORDE_WIDTH,93.0/479*KEYBORDE_HEIGHT,28,7,51);//draw signborde    }    else if(flag_caps)    {	GrCopyArea(wifi_keyborde_wid,pid_copy_gc,36*2.0/800*KEYBORDE_WIDTH,8.0/479*KEYBORDE_HEIGHT,		   36.0/800*KEYBORDE_WIDTH,20.0/479*KEYBORDE_HEIGHT,pid_keyborde,2*BUTTON_WIDTH,		   44.0/479*KEYBORDE_HEIGHT,0);//draw flag	drawkey(110.0/800*KEYBORDE_WIDTH,93.0/479*KEYBORDE_HEIGHT,26,7,79);//draw commonborde    }    else    {	drawkey(110.0/800*KEYBORDE_WIDTH,93.0/479*KEYBORDE_HEIGHT,28,7,4);    }}

⌨️ 快捷键说明

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