//
/* --------------------------------------------------------------------------------------------------- opt_mouse.java 光学式マウス ver. 3.00 (JDK 1.02) ueyama@infonet.co.jp 2004.05.23 update: 2007.09.21 --------------------------------------------------------------------------------------------------- */ import java.applet.*; import java.awt.*; public class opt_mouse extends Applet { int Mx =63,My =63; // マウスセンサの初期位置 int Mbx=63,Mby=63; // 同上バックアップ int Mcx=63,Mcy=63; // クリックされたときの座標 int Mdx=63,Mdy=63; // ドラッグ中のマウスセンサの位置 int Tx=468, Ty=113; // テキストデータ基準表示座標 int Dx=144, Dy=144; // マウス移動量 Image Img, Buf; Graphics gr; public void init() // 初期設定 { String bg=getParameter("bgcolor"); // 背景色の取得と設定 int 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(); Buf=createImage(144,144); } public boolean inside(int x, int a, int b) // マウスの位置座標チェック { return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false; } public void dsp_view(int x, int y, int c, Graphics g) // マウスセンサの視野 (枠) の表示 { if(c==0) g.setColor(new Color(255,255, 51)); // 新・視野色 if(c==1) g.setColor(new Color(255,255,204)); // 旧・視野色 g.drawRect(x-1, y-1,145,145); g.drawRect(x, y,143,143); } public void del_view(int x, int y) // センサ枠の消去 { dsp_bg(x, y, 146, 2, x, y); dsp_bg(x, y, 2, 146, x, y); dsp_bg(x, y+144, 146, 2, x, y+144); dsp_bg(x+144, y, 2, 146, x+144, y); } public void dsp_bg(int x, int y, int w, int h, int ox, int oy) // 画像の部分表示 { Graphics gx=getGraphics(); gx.clipRect(x, y, w, h); gx.drawImage(Img, x-ox, y-oy, this); gx.dispose(); } public void dsp_g(int x, int y, int m, int n, int c) // 数字・文字の表示 { int w=0, h=0, ox=0, oy=0; switch(c) { case 0: w= 26; h= 16; ox= 0; oy=270; break; // 数字 case 1: w= 13; h= 16; ox= 78; oy=318; break; // 符号 case 2: w= 16; h= 16; ox=104; oy=318; break; // "縦"・"横" case 3: w= 27; h= 11; ox=139; oy=318; break; // "ドット" case 4: w= 45; h= 13; ox=168; oy=318; break; // "移動量" case 5: w= 56; h= 11; ox=214; oy=318; break; // "センサ画像" } Graphics gx=getGraphics(); gx.clipRect(x, y, w, h); gx.clearRect(x, y, w, h); gx.drawImage(Img,x-(ox+m*w),y-(oy+n*h),this); gx.dispose(); } public void dsp_mouse() // マウス位置の表示 { int mx=0, my=0, dx=Mdx-Mx, dy=Mdy-My; Graphics gx=getGraphics(); gx.clipRect(0, 0, 270, 270); dsp_view(Mx, My, 1, gx); // 移動前のマウス視野(枠)の表示 dsp_view(Mdx, Mdy, 0, gx); // 移動後 gx.setColor(new Color(255,187,0)); // 新旧共通部分の表示 gx.drawRect(Math.max(Mdx,Mx)-1, Math.max(Mdy,My)-1, Dx+1,Dy+1); // 長方形を描く gx.drawRect(Math.max(Mdx,Mx), Math.max(Mdy,My), Dx-1,Dy-1); gx.dispose(); dsp_g(342,216,0,0,5); // "センサ画像" の表示 Graphics gs=Buf.getGraphics(); // バッファを準備する gs.clearRect(0, 0, 144, 144); gs.clipRect(0, 0, 144, 144-(Mdy-126)); gs.drawImage(Img, -Mdx, -Mdy, this); // バッファにセンサ画像を描く gs.setColor(new Color(255,204,0)); // 共通部分の枠を作成 gs.drawRect( ((dx>0)?0:144-Dx),((dy>0)?0:144-Dy), Dx, Dy); // 枠をバッファに描く gs.drawRect( ((dx>0)?1:143-Dx),((dy>0)?1:143-Dy), Dx, Dy); gs.dispose(); gr.drawImage(Buf,297, 63,this); // バッファの表示 gr.setColor(new Color(99,99,99)); // センサ画像部の枠の表示 gr.drawRect(296,62,145,145); if(Dx>0 && Dy>0) // マウス移動量データの表示 { mx=(144-Dx)/9; my=(144-Dy)/9; dsp_g(Tx+14,Ty+20,(Mx>Mdx)?0:1,0,1); // 横方向符号 dsp_g(Tx+26,Ty+20,mx%10,mx/10,0); // 〃 数字 dsp_g(Tx+14,Ty+70,(My>=Mdy)?1:0,0,1); // 縦方向符号 dsp_g(Tx+26,Ty+70,my%10,my/10,0); // 〃 数字 } else gr.clearRect(485,132,35,67); } public void paint(Graphics g) { Mx=Mbx; My=Mby; g.clearRect(0, 0, size().width, size().height); g.drawImage(Img,0,0,this); dsp_g(490, 70,0,0,4); // "移動量" dsp_g(Tx, Ty, 1,0,2); // "横" dsp_g(Tx+58,Ty+25,0,0,3); // "ドット" dsp_g(Tx ,Ty+50,0,0,2); // "縦" dsp_g(Tx+58,Ty+75,0,0,3); // "ドット" dsp_mouse(); // マウス位置の表示 } public boolean mouseDown(Event e, int x, int y) // マウスがクリックされたときの処理 { if(inside(x,Mx,Mx+144) && inside(y,My,My+144)) // 視野内であれば (144=16×9) { Mcx=x; Mcy=y; del_view(Mbx-1, Mby-1); // 旧センサ枠の消去 } return true; } public boolean mouseDrag(Event e, int x, int y) // マウスがドラッグされたときの処理 { if(inside(x,Mdx,Mdx+144) && inside(y,Mdy,Mdy+144)) // 視野内であれば { del_view(Mdx-1, Mdy-1); // センサ枠の消去 Mdx=(Mx+x-Mcx)/9*9; Mdy=(My+y-Mcy)/9*9; // センサ位置 (9 の整数倍化する) Dx=144-Math.abs(Mx-Mdx); Dy=144-Math.abs(My-Mdy); // マウスの移動量 dsp_mouse(); // マウス位置の表示 } return true; } public boolean mouseUp(Event e, int x, int y) // マウスが離されたときの処理 { if(inside(x,Mdx,Mdx+144) && inside(y,Mdy,Mdy+144)) { Mbx=Mx; Mby=My; Mx=Mdx; My=Mdy; } return true; } } //戻る