1: /* $Id: 1048613.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: #include "databox.h" 11: 12: 13: #define REDISPRECTNUM 10 /* 再表示用の矩形リストの数 */ 14: 15: /* -------------------- 選択枠関係 -------------------- */ 16: 17: 18: SEL_LIST* slSelectFrameList=NULL; /* 選択枠リスト */ 19: 20: /* 選択枠の表示 */ 21: void DrawSelectFrame(W aidWnd,W awMode,W awDx,W awDy) 22: /* aidWnd; 値がマイナスなら描画環境 */ 23: { 24: W idDrawEnv; 25: RECT rctWork; 26: 27: if(slSelectFrameList==NULL) 28: return; 29: if(aidWnd>0) /* ウインドウに描くとき */ 30: { 31: idDrawEnv=wget_gid(aidWnd); 32: wget_wrk(aidWnd,&rctWork); 33: gset_vis(idDrawEnv,rctWork); /* 領域のセット */ 34: }else /* 描画環境に描くとき */ 35: idDrawEnv=-aidWnd; 36: adsp_slt(idDrawEnv,slSelectFrameList,awMode,awDx,awDy); /* 選択枠を表示 */ 37: } 38: 39: BOOL MakeSelectFrame(void) 40: { 41: static SEL_LIST slFrame; 42: DOCITERATOR diVobj; 43: 44: if(GetSelectedVobj()==NULL) 45: { 46: slSelectFrameList=NULL; 47: return TRUE; 48: } 49: slSelectFrameList=&slFrame; 50: diVobj=GetSelectedVobj(); 51: slSelectFrameList[0].next=NULL; 52: slSelectFrameList[0].rgn.sts=0x0000; 53: slSelectFrameList[0].rgn.rgn.r=GetRect(diVobj); 54: 55: return TRUE; 56: } 57: 58: 59: /* -------------------- 描画関係 -------------------- */ 60: 61: #define PAPERNUM 3 62: #define PAPERSPACE 2 63: 64: /* 紙を重ねた物の表示 */ 65: void DispPaper(W aidDrawEnv,RECT arctPaper) 66: { 67: PAT paWhite; 68: PAT paBlack; 69: int i; 70: 71: paWhite.spat.kind=0; 72: paWhite.spat.hsize=8; 73: paWhite.spat.vsize=8; 74: paWhite.spat.fgcol=0x1fffffffL; 75: paWhite.spat.bgcol=0; 76: paWhite.spat.mask=FILL100; 77: 78: paBlack.spat.kind=0; 79: paBlack.spat.hsize=8; 80: paBlack.spat.vsize=8; 81: paBlack.spat.fgcol=0x10000000L; 82: paBlack.spat.bgcol=0; 83: paBlack.spat.mask=FILL100; 84: 85: arctPaper.c.left+=PAPERSPACE*PAPERNUM; 86: arctPaper.c.top+=PAPERSPACE*PAPERNUM; 87: arctPaper.c.right+=PAPERSPACE*PAPERNUM; 88: arctPaper.c.bottom+=PAPERSPACE*PAPERNUM; 89: for(i=0; i<PAPERNUM; i++) 90: { 91: arctPaper.c.left-=PAPERSPACE; 92: arctPaper.c.top-=PAPERSPACE; 93: arctPaper.c.right-=PAPERSPACE; 94: arctPaper.c.bottom-=PAPERSPACE; 95: gfil_rec(aidDrawEnv,arctPaper,&paWhite,0,G_STORE); 96: gfra_rec(aidDrawEnv,arctPaper,0x0001,&paBlack,0,G_STORE); 97: } 98: } 99: 100: void DrawOneRect(W aidWnd,RECT arctDraw) 101: { 102: W idDrawEnv; 103: DOCITERATOR diCurrent; 104: 105: idDrawEnv=wget_gid((aidWnd<0)?(-aidWnd):aidWnd); /* 描画環境の取得 */ 106: gset_vis(idDrawEnv,arctDraw); /* 領域のセット */ 107: 108: wera_wnd((aidWnd<0)?(-aidWnd):aidWnd,&arctDraw); /* 背景色で塗りつぶす */ 109: diCurrent=NULL; 110: while( (diCurrent=GetNext(diCurrent)) !=NULL ) 111: { 112: RECT rctVobj; 113: 114: rctVobj=GetRect(diCurrent); 115: if(IsFusen(diCurrent)) /* 付箋 */ 116: { 117: if(!(rctVobj.c.right<arctDraw.c.left|| 118: rctVobj.c.left>arctDraw.c.right|| 119: rctVobj.c.bottom<arctDraw.c.top|| 120: rctVobj.c.top>arctDraw.c.bottom )) 121: /* 表示領域に入っていたら */ 122: { 123: if(aidWnd<0) 124: odsp_vob(GetVID(diCurrent),&arctDraw,V_DISP|V_NOFRAME); 125: else 126: odsp_vob(GetVID(diCurrent),&arctDraw,V_DISPALL); 127: } 128: }else{ /* 仮身 */ 129: if(!(rctVobj.c.right+PAPERSPACE*PAPERNUM<arctDraw.c.left|| 130: rctVobj.c.left>arctDraw.c.right|| 131: rctVobj.c.bottom+PAPERSPACE*PAPERNUM<arctDraw.c.top|| 132: rctVobj.c.top>arctDraw.c.bottom )) 133: { /* 表示領域に入っていたら */ 134: DispPaper(idDrawEnv,rctVobj); /* 紙を重ねた物の表示 */ 135: if(aidWnd<0) 136: odsp_vob(GetVID(diCurrent),&arctDraw,V_DISP|V_NOFRAME); 137: else 138: odsp_vob(GetVID(diCurrent),&arctDraw,V_DISPALL); 139: } 140: } 141: } 142: } 143: 144: 145: /* 再表示処理をする */ 146: void DrawView(W aidWnd) 147: { 148: static RLIST rlListItem[REDISPRECTNUM]; 149: static RLIST* prlList=NULL; /* 再表示用の矩形リスト */ 150: 151: DrawSelectFrame(aidWnd,0,0,0); 152: 153: if(prlList==NULL) 154: { /* 再表示用の矩形リストの初期化 */ 155: int i; 156: 157: prlList=rlListItem; 158: for(i=0; i<REDISPRECTNUM-1; i++) 159: rlListItem[i].next=&rlListItem[i+1]; 160: rlListItem[REDISPRECTNUM-1].next=NULL; 161: } 162: 163: do { 164: int iRectNum,i; 165: RECT rctDraw; 166: 167: iRectNum=wsta_dsp(aidWnd,&rctDraw,prlList); /* 再表示開始 */ 168: if(iRectNum==0) 169: break; 170: if(iRectNum>REDISPRECTNUM) /* 再表示の必要な矩形の数が多いとき */ 171: DrawOneRect(aidWnd,rctDraw); 172: else /* 再表示の必要な矩形の数が少ないとき */ 173: for(i=0; i<iRectNum; i++) 174: DrawOneRect(aidWnd,rlListItem[i].rcomp); /* 1つ1つ描く */ 175: }while(wend_dsp(aidWnd)>0); 176: return; 177: } 178: