1: /* $Id: 1048611.html,v 1.1.1.1 2000/08/28 11:39:25 hidetosi Exp $ */ 2: #include <btron/btron.h> 3: #include <btron/hmi.h> 4: #include <btron/vobj.h> 5: #include <typedef.h> 6: #include <bstdlib.h> 7: #include "paperbox.h" 8: #include "view.h" 9: #include "doc.h" 10: 11: W idBar[2]; 12: 13: 14: BOOL SetBarValue(W aidWnd) 15: { 16: W value[4]; 17: RECT rctWnd,rctDoc; 18: static RECT rctOldWnd={{0,0,0,0}},rctOldDoc={{0,0,0,0}}; 19: 20: rctDoc=GetDocRect(); 21: rctDoc.c.top=0; 22: rctDoc.c.left=0; 23: wget_wrk(aidWnd,&rctWnd); 24: 25: if(rctWnd.c.top!=rctOldWnd.c.top || rctWnd.c.bottom!=rctOldWnd.c.bottom || 26: rctDoc.c.top!=rctOldDoc.c.top || rctDoc.c.bottom!=rctOldDoc.c.bottom) 27: { 28: value[0]=rctWnd.c.top; 29: value[1]=rctWnd.c.bottom; 30: value[2]=rctDoc.c.top; 31: value[3]=rctDoc.c.bottom; 32: if(value[0]<value[2]) 33: value[2]=value[0]; 34: if(value[1]>value[3]) 35: value[3]=value[1]; 36: 37: cset_val(idBar[RIGHTBAR],4,value); 38: } 39: if(rctWnd.c.left!=rctOldWnd.c.left || 40: rctWnd.c.right!=rctOldWnd.c.right || 41: rctDoc.c.left!=rctOldDoc.c.left || 42: rctDoc.c.right!=rctOldDoc.c.right) 43: { 44: value[0]=rctWnd.c.right; 45: value[1]=rctWnd.c.left; 46: value[2]=rctDoc.c.right; 47: value[3]=rctDoc.c.left; 48: if(value[0]>value[2]) 49: value[2]=value[0]; 50: if(value[1]<value[3]) 51: value[3]=value[1]; 52: 53: cset_val(idBar[BOTTOMBAR],4,value); 54: } 55: rctOldWnd=rctWnd; 56: rctOldDoc=rctDoc; 57: return TRUE; 58: } 59: 60: 61: BOOL InitScrollBar(W aidWnd) 62: { 63: /* スクロールバーのパーツ ID を取り出す */ 64: wget_bar(aidWnd,&idBar[RIGHTBAR],&idBar[BOTTOMBAR],NULL); 65: 66: /* スムーズスクロール */ 67: cchg_par( idBar[RIGHTBAR], P_DRAGBREAK|P_NORMAL|P_ENABLE ); 68: cchg_par( idBar[BOTTOMBAR], P_DRAGBREAK|P_NORMAL|P_ENABLE ); 69: 70: SetBarValue(aidWnd); 71: 72: return TRUE; 73: } 74: 75: 76: void ScrollByBarDifference(int aiBar,W* apwOld,W* apwNew,W aidWnd) 77: { 78: W idDrawEnv; 79: W wMove; 80: W err; 81: RECT rctWork; 82: 83: if(apwNew[0]==apwOld[0]) 84: return; 85: 86: idDrawEnv=wget_gid(aidWnd); /* 描画環境の取得 */ 87: wget_wrk(aidWnd,&rctWork); 88: gset_vis(idDrawEnv,rctWork); /* 領域のセット */ 89: 90: wMove=apwOld[0]-apwNew[0]; 91: if(aiBar==RIGHTBAR) 92: err=wscr_wnd(aidWnd,(RECT*)NULL,0,wMove,W_SCRL|W_RDSET); 93: else 94: err=wscr_wnd(aidWnd,(RECT*)NULL,wMove,0,W_SCRL|W_RDSET); 95: 96: SetBarValue(aidWnd); 97: 98: if(err&W_RDSET) /* 再表示が必要なら */ 99: DrawView(aidWnd); 100: } 101: 102: 103: 104: void BarMove(int aiBar,int aiDirection,W aiSmoothOrArea,W aidWnd,BOOL aisEnlarge) 105: /* aiDirection; 移動方向 1:正 -1:負 */ 106: /* aiSmoothOrArea; P_SMOOTH P_AREA */ 107: { 108: static W wHeight=16; /* 文字の高さ */ /* "16"に固定(toriumi) */ 109: W pwOld[4]; 110: W pwBarValue[4]; 111: int iKnobSize; 112: 113: /* gget_fntのlinkができないため、以下の行を削除(toriumi) 114: if(wHeight==0) 115: { 116: TC DevName[11]; 117: DEV_SPEC spec; 118: FNTINFO info; 119: W wGid; 120: 121: wGid=wget_gid(aidWnd); 122: gget_dev(wGid,DevName); 123: gget_spc(DevName,&spec); 124: gget_fnt(wGid,NULL,&info); 125: wHeight=info.height; 126: } 127: */ 128: cget_val(idBar[aiBar],4,pwOld); 129: pwBarValue[0]=pwOld[0]; 130: pwBarValue[1]=pwOld[1]; 131: pwBarValue[2]=pwOld[2]; 132: pwBarValue[3]=pwOld[3]; 133: 134: iKnobSize=pwOld[0]-pwOld[1]; 135: if(iKnobSize<0) 136: iKnobSize=-iKnobSize; 137: 138: if(aiSmoothOrArea==P_SMOOTH) 139: { 140: pwBarValue[0]+=wHeight*aiDirection; 141: pwBarValue[1]+=wHeight*aiDirection; 142: }else{ 143: pwBarValue[0]+=iKnobSize*aiDirection; 144: pwBarValue[1]+=iKnobSize*aiDirection; 145: } 146: 147: if(pwBarValue[0]>pwBarValue[2] && aiBar==BOTTOMBAR && !aisEnlarge) 148: { /* 右端を越えた */ 149: pwBarValue[0]=pwBarValue[2]; 150: pwBarValue[1]=pwBarValue[2]-iKnobSize; 151: }else 152: if(pwBarValue[0]<pwBarValue[2] && aiBar==RIGHTBAR && !aisEnlarge) 153: { /* 上端を越えた */ 154: pwBarValue[0]=pwBarValue[2]; 155: pwBarValue[1]=pwBarValue[2]+iKnobSize; 156: }else 157: if(pwBarValue[1]<pwBarValue[3] && aiBar==BOTTOMBAR && !aisEnlarge) 158: { /* 左端を越えた */ 159: pwBarValue[1]=pwBarValue[3]; 160: pwBarValue[0]=pwBarValue[3]+iKnobSize; 161: }else 162: if(pwBarValue[1]>pwBarValue[3] && aiBar==RIGHTBAR && !aisEnlarge) 163: { /* 右端を越えた */ 164: pwBarValue[1]=pwBarValue[3]; 165: pwBarValue[0]=pwBarValue[3]-iKnobSize; 166: } 167: 168: if(pwBarValue[0]<0 && aiBar==RIGHTBAR) 169: { 170: pwBarValue[0]=0; 171: pwBarValue[1]=iKnobSize; 172: } 173: if(pwBarValue[1]<0 && aiBar==BOTTOMBAR) 174: { 175: pwBarValue[0]=iKnobSize; 176: pwBarValue[1]=0; 177: } 178: 179: /* cset_val(idBar[aiBar],4,pwBarValue);*/ 180: 181: ScrollByBarDifference(aiBar,pwOld,pwBarValue,aidWnd); 182: } 183: 184: 185: void ActScrollBar(int aiBar,WEVENT* aevWnd) 186: { 187: UW ret; 188: W pwOldBarValue[4]; 189: 190: cget_val(idBar[aiBar],4,pwOldBarValue); 191: while( ((ret=cact_par(idBar[aiBar],aevWnd))&0x6000) == 0x6000 ) 192: { /* 中断の時 */ 193: if(ret&0x0008) /* ジャンプ移動の中断なら */ 194: { 195: W pwNewBarValue[4]; 196: 197: cget_val(idBar[aiBar],4,pwNewBarValue); 198: ScrollByBarDifference(aiBar,pwOldBarValue, 199: pwNewBarValue,aevWnd->s.wid); 200: cget_val(idBar[aiBar],4,pwOldBarValue); 201: }else{ /* スムーズ移動の中断 */ 202: if(ret&0x0001) /* 増加方向なら */ 203: BarMove(aiBar,1,P_SMOOTH,aevWnd->s.wid,FALSE); 204: else /* 減少方向なら */ 205: BarMove(aiBar,-1,P_SMOOTH,aevWnd->s.wid,FALSE); 206: aevWnd->s.type=EV_NULL; 207: } 208: } 209: if( (ret&0x100c) == 0x1004 ) /* エリア移動の時 */ 210: { 211: if(ret&0x0001) /* 増加方向なら */ 212: BarMove(aiBar,1,P_AREA,aevWnd->s.wid,FALSE); 213: else /* 減少方向なら */ 214: BarMove(aiBar,-1,P_AREA,aevWnd->s.wid,FALSE); 215: }else if( (ret&0x100c) == 0x1000 ) /* スムーズ移動の時 */ 216: { 217: if(ret&0x0001) /* 増加方向なら */ 218: BarMove(aiBar,1,P_SMOOTH,aevWnd->s.wid,FALSE); 219: else /* 減少方向なら */ 220: BarMove(aiBar,-1,P_SMOOTH,aevWnd->s.wid,FALSE); 221: }else if( (ret&0x100c) == 0x1008 ) /* ジャンプ移動の時 */ 222: { 223: W pwNewBarValue[4]; 224: 225: cget_val(idBar[aiBar],4,pwNewBarValue); 226: ScrollByBarDifference(aiBar,pwOldBarValue,pwNewBarValue,aevWnd->s.wid); 227: } 228: } 229: