//
/* ---------------------------------------------------------------------------------------------- ch_code.java キャラクタコード ver. 1.00 (JDK 1.02) ueyama@infonet.co.jp 2001.11.11 ---------------------------------------------------------------------------------------------- */ import java.applet.*; import java.awt.*; import java.util.*; public class ch_code extends Applet { int Xs = 12, Ys = 6, Sn = 0; // 入力文字表示座標・文字数 int Sl[]={0, 0, 1, 2, 0, 3, 4}; int Sc[]=new int[26]; // 一般キー ************************************************************************* int Xt = 225, Yt = 62; int Xk = 70, Yk = 313; // キー表示オフセット int Kx[]={ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1 189, 36, 72,108,144,180,216,252,288,324,387,423,333,396,369,405, // 2 SP 〜 / 360, 36, 72,108,144,180,216,252,288,324,423,387,333,396,369,405, // 3 0 〜 ? 414, 63,225,153,135,126,171,207,243,306,279,315,351,297,261,342, // 4 @ 〜 O 378, 54,162, 99,198,270,189, 90,117,234, 81,450,468,459,432,441, // 5 P 〜 _ 414, 63,225,153,135,126,171,207,243,306,279,315,351,297,261,342, // 6 〜 o 378, 54,162, 99,198,270,189, 90,117,234, 81,450,468,459,432,441, // 7 p 〜 _ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 8 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 9 -1,369,450,459,333,405,360,108,126,144,180,216,252,288,324, 81, // A 、 〜 ッ 468,108,126,144,180,216,198,207,243,423,225,117,135,162,378,153, // B ー 〜 ソ 54, 63, 81, 90, 99,270,306, 36,333,315,171,189, 72,432,396,279, // C タ 〜 マ 261,459,405,297,252,288,324,342,351,369,387,441,360,234,414,450,-1}; // D ミ 〜 ゜ int Ky[]={ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 72,108, 0,108,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 72,108, 0,108,108, 36, 72,108,108, 72, 36, 72, 72, 72, 36, 72, 72, 72,108,108, 36, 36, 36, 36, 72, 36, 36,108, 36,108, 36,108, 36, 0, 72, 0,108, 36, 72,108,108, 72, 36, 72, 72, 72, 36, 72, 72, 72,108,108, 36, 36, 36, 36, 72, 36, 36,108, 36,108, 36,108, 36, 0, 72, 0,108, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,108, 36, 72,108,108, 0, 0, 36, 0, 0, 0, 0, 0, 0,108, 0, 0, 36, 0, 0, 0, 36, 72, 72, 72,108,108, 72, 36, 36,108, 36, 72,108, 36, 72, 36, 36, 0,108, 72, 72,108, 0, 0, 0, 72, 108, 72,108,108, 0, 0, 0, 36, 72,108, 72,108, 0, 36, 36, 36,-1}; int Kn[][]={{0x21,0x31,0xc7,0},{0x22,0x32,0xcc,0},{0x23,0x33,0xb1,0xa7}, // キー割り当て 1列目 {0x24,0x34,0xb3,0xa9},{0x25,0x35,0xb4,0xaa},{0x26,0x36,0xb5,0xab}, {0x27,0x37,0xd4,0xac},{0x28,0x38,0xd5,0xad},{0x29,0x39,0xd6,0xae}, {0,0x30,0xdc,0xa6},{0x3d,0x2d,0xce,0},{0x7e,0x5e,0xcd,0},{0x7c,0x5c,0xb0,0}, {0,0x51,0xc0,0},{0,0x57,0xc3,0},{0,0x45,0xb2,0xa8},{0,0x52,0xbd,0}, // 2列目 {0,0x54,0xb6,0},{0,0x59,0xdd,0},{0,0x55,0xc5,0},{0,0x49,0xc6,0}, {0,0x4f,0xd7,0},{0,0x50,0xbe,0},{0x60,0x40,0xde,0},{0x7b,0x5b,0xdf,0xa2}, {0,0x41,0xc1,0},{0,0x53,0xc4,0},{0,0x44,0xbc,0},{0,0x46,0xca,0}, // 3列目 {0,0x47,0xb7,0},{0,0x48,0xb8,0},{0,0x4a,0xcf,0},{0,0x4b,0xc9,0}, {0,0x4c,0xd8,0},{0x2b,0x3b,0xda,0},{0x2a,0x3a,0xb9,0},{0x7d,0x5d,0xd1,0xa3}, {0,0x5a,0xc2,0xaf},{0,0x58,0xbb,0},{0,0x43,0xbf,0},{0,0x56,0xcb,0}, // 4列目 {0,0x42,0xba,0},{0,0x4e,0xd0,0},{0,0x4d,0xd3,0},{0x3c,0x2c,0xc8,0xa4}, {0x3e,0x2e,0xd9,0xa1},{0x3f,0x2f,0xd2,0xa5},{0x5f,0,0xdb,0}}; int Kox[]={ 7, 7, 18, 18}; // キー 文字表示オフセット X int Koy[]={ 4, 17, 17, 4}; // キー 文字表示オフセット Y // 特殊キー 0: esc 1: tab 2: caps lock 3: shift 4: sp 5: del 6: bs 7: enter 8: カナ/英数 int Kw0[]={ 36, 54, 63, 81, 139, 36, 54, 45, 63}; // 幅 int Kx0[]={ 0, 0, 0, 0, 189, 504, 486, 495, 477}; // 表示オフセット X int Ko[] ={352,369,385,432, 0, 452, 465, 476, 501}; // 文字オフセット X int Kw[] ={ 17, 16, 47, 20, 0, 13, 11, 25, 41}; // 文字幅 int Kc[] ={0x1b,0x09,0, 0, 0x20,0x7f,0x08,0x0a, 0}; // コード // 特殊キー動作 0: caps lock 1: shift 2: カナ 3: 英数 ************************* int Xd[] ={ 12, 72, 484, 506}; // 表示 文字オフセット int Xw[] ={ 47, 20, 15, 19}; // 表示 文字幅 int Xo[] ={385,432, 501, 523}; boolean Xl[] ={false, false, false, true}; // 状態 boolean Cap=false; // 大文字 AudioClip Ac; // 効果音 Graphics gr; int Bgc; Image Img; public void init() { String Bg=getParameter("BgColor"); Bgc=Integer.valueOf(Bg,16).intValue(); setBackground(new Color(Bgc)); MediaTracker mt=new MediaTracker(this); Img=getImage(getCodeBase(), getParameter("figure")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; gr=getGraphics(); Ac=getAudioClip(getCodeBase(), getParameter("audioclip")); } public boolean inside(int x, int a, int b) { return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false; } public boolean inner(int x, int x1, int x2, int y, int y1, int y2) { return (x<=Math.max(x1,x2) && x>=Math.min(x1,x2) && y<=Math.max(y1,y2) && y>=Math.min(y1,y2)) ? true:false; } public void dsp_img(int x, int y, int n, int m) { Graphics gx=gr.create(); int w=0, h=0, ox=0, oy=0; switch(n) { case 0: w= 19; h=19; ox= 0; oy=135; break; // 文字 0x20 〜 0x3f case 1: w= 19; h=19; ox= 0; oy=154; break; // 文字 0x40 〜 0x5f case 2: w= 19; h=19; ox= 0; oy=173; break; // 文字 0x60 〜 0x7f case 3: w= 19; h=19; ox= 0; oy=192; break; // 文字 0xa0 〜 0xbf case 4: w= 19; h=19; ox= 0; oy=211; break; // 文字 0xc0 〜 0xdf case 5: w= 11; h=11; ox=352; oy= 47; break; // 16進数 case 6: w= 48; h= 8; ox=532; oy= 0; break; // 上位4ビット case 7: w= 8; h=50; ox=590; oy= 0; break; // 下位4ビット case 8: w= 26; h=23; ox=512; oy= 10; break; // クリアボタン case 9: w= 36; h=36; ox= 0; oy= 0; break; // キートップ } gx.clipRect(x,y,w,h); gx.drawImage(Img,x-(ox+m*w),y-oy,this); gx.dispose(); } public void dsp_str(int n, int c) // 入力文字の表示 { dsp_img(Xs+n*26, Ys, Sl[c/32], c%32); dsp_img(Xs+n*26, Ys+22, 5, c/16); dsp_img(Xs+n*26+10, Ys+22, 5, c%16); } public void dsp_key(int n, boolean f) // キー & 文字表示 n: キーNo. { Graphics gx; int i,m; int c = Kn[n][2]; int x = Kx[c], y = Ky[c]; dsp_img(Xk+x, Yk+y, 9, (f)?1:0); for(i=0;i<4;i++) { c = Kn[n][i]; if(c>0) { gx=gr.create(); m=inside(c, 0xa0, 0xe0)? 2: 0; gx.clipRect(Xk+Kox[i]+x, Yk+Koy[i]+y, 11, 11); gx.drawImage(Img, Xk+Kox[i]+x-(c%32)*11, Yk+Koy[i]+y-((c/32+m)*11+36), this); gx.dispose(); } } } public void dsp_key0(int n, boolean f) // 特殊キーの表示 { Graphics gx=gr.create(); int x = Xk + Kx0[n], y = Yk + n%5 * 36, ox = (f)? 36: 0; if(inside(n,1,3) || inside(n,6,8)) ox=(f)?153:72; else if(n==4) ox=(f)?373:234; if(n==0 || n==4 || n==5) // キートップの表示 { gx.clipRect(x, y, Kw0[n], 36); gx.drawImage(Img, x-ox, y, this); } else { gx.clipRect(x, y, Kw0[n]-18, 36); gx.drawImage(Img, x-ox, y, this); gx.dispose(); ox=((f)?234:153)-Kw0[n]/2; gx=gr.create(); gx.clipRect(x+Kw0[n]-Kw0[n]/2, y, Kw0[n]/2, 36); gx.drawImage(Img, x+Kw0[n]-Kw0[n]/2-ox, y, this); } gx.dispose(); gx=gr.create(); // 文字の表示 gx.clipRect(x+7, y+16, Kw[n], 11); gx.drawImage(Img, x-Ko[n]+7, y+16-36, this); gx.dispose(); } public void dsp_exk(int n) // 特殊キーの動作表示 { Graphics gx=gr.create(); gx.clipRect(Xk+Xd[n],Yk+168,Xw[n],11); gx.drawImage(Img,Xk+Xd[n]-Xo[n],Yk+168-36,this); gx.dispose(); gx=gr.create(); gx.clipRect(Xk+Xd[n] +Xw[n]/2-5,Yk+156,10,10); gx.drawImage(Img,Xk+Xd[n]+Xw[n]/2-5 -(512+((Xl[n])?10:0)), Yk+156, this); gx.dispose(); } public void dsp_chr(int n) // キャラクタコード表 文字表示 { Graphics gx=gr.create(); int x = (n/32)*28 + ((n%32)/16 + 1)*14, y = (n%16 + 1)*14; gx.clipRect(Xt+x+2, Yt+y+2, 11, 11); gx.drawImage(Img, Xt+2+x-(n%32)*11, Yt+2+y-(36+(n/32)*11), this); gx.dispose(); } public void dsp_cct(int c, boolean f) // クリック時の文字コード表表示 { int i, tx=(c/16+1)*14+Xt+1, ty=(c%16+1)*14+Yt+1; gr.setColor((f)?new Color(255,255,51):new Color(Bgc)); gr.fillRect(tx, ty, 13, 13); dsp_chr(c); gr.fillRect(Xt+1, ty, 13, 13); gr.fillRect(tx, Yt+1, 13, 13); gr.setColor((f)?new Color(255,255,184):new Color(Bgc)); for(i=0;i戻る0) m=0; // 英記号 if(inside(Kn[n][1], 0x41,0x5b)) Cap=true; // 大文字 } else Cap=false; if(Xl[0]) Cap=true; } if(Xl[1] && Xl[2] && Kn[n][3]>0) m=3; // カナ記号 c=Kn[n][m]; if(!Cap && inside(c, 0x41,0x5a)) c+=0x20; if(inside(c, 0x20, 0xdf)) { dsp_key(n, f); dsp_cct(c, f); } if(f && Sn<26 && c>0) { gr.setColor(new Color(244,255,51)); gr.fillRect(Xs+Sn*26-3, 3, 26, 38); dsp_str(Sn, c); Sc[Sn++]=c; } if(!f && Sn<27 && c>0) { gr.setColor(new Color(255,255,255)); gr.fillRect(Xs+(Sn-1)*26-3, 3, 26, 38); dsp_str(Sn-1, Sc[Sn-1]); } } else { for(n=0; n<9; n++) if(inner(x,Kx0[n],Kx0[n]+Kw0[n], y,(n%5)*36,(n%5+1)*36)) break; if(n<9) // 特殊キー { dsp_key0(n, f); c=Kc[n]; if(c>0) dsp_cct(c, f); if(f) { switch(n) { case 2: Xl[0]=!Xl[0]; if(Xl[0]) Cap=true; break; // caps lock case 3: Xl[1]=!Xl[1]; break; // shift case 8: Xl[3]=!Xl[3]; Xl[2]=!Xl[3]; break; // カナ/英数 } if(c==0x20 && Sn<26) { dsp_str(Sn, c); Sc[Sn++]=c; } if(c==0x08 && Sn>0) { Sn--; gr.setColor(new Color(255,255,255)); gr.fillRect(Xs+Sn*26-3, 1, 26, 42); } } for(i=0; i<4; i++) dsp_exk(i); } } if(f && Sn>=26) Ac.play(); } m=(Sn==0)? 2:0; if(f && Sn>0 && inner(x,560,560+26, y,156,156+23)) { gr.setColor(new Color(255,255,255)); gr.fillRect(1, 1, 698, 42); Sn=0; m=1; } dsp_img(Xk+560, Yk+156, 8, m); } public boolean mouseDown(Event e, int x, int y) { mouse_clik(x,y, true); return true; } public boolean mouseUp(Event e, int x, int y) { mouse_clik(x,y, false); return true; } } //