📄 keyborde.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 + -