#define BTTN_BORDER 2 #define BTF_DONT_FREE 1 class CCtrlBttnState { I64 state,num_states,flags; U8 *state_texts; CColorROPU32 *state_colors; }; U0 DrawCtrlBttn(CDC *dc,CCtrl *c) { CCtrlBttnState *s=c->state; I64 l; U8 *st; dc->color=BLACK; GrRect(dc,c->left,c->top,c->right-c->left+1,c->bottom-c->top+1); if (!(st=LstSub(s->state,s->state_texts))) st=s->state_texts; dc->color=s->state_colors[s->state]; l=StrLen(st); GrRect(dc,c->left+BTTN_BORDER,c->top+BTTN_BORDER, c->right-c->left+1-BTTN_BORDER*2, c->bottom-c->top+1-BTTN_BORDER*2); dc->color=s->state_colors[s->state]^(WHITE<<16+WHITE); GrPrint(dc,(c->left+c->right+1-l*FONT_WIDTH)>>1, (c->top+c->bottom+1-FONT_HEIGHT)>>1,"%s",st); } U0 LeftClickCtrlBttn(CCtrl *c,I64,I64,Bool down) { CCtrlBttnState *s=c->state; if (down) { s->state++; if (s->state==s->num_states) s->state=0; } } public CCtrl *CtrlBttnNew(I64 x,I64 y,I64 width=-1,I64 height=-1, I64 num_states=1,U8 *state_texts, I32 *state_colors,CCtrlBttnState *_s=NULL) {//Create bttn ctrl. See ::/Apps/Strut/Strut.HC. CCtrl *res; CCtrlBttnState *s; I64 i,j,l; U8 *st; if (width<0) { l=1; for (i=0; i<num_states; i++) if (st=LstSub(i,state_texts)) { j=StrLen(st); if (j>l) l=j; } width=BTTN_BORDER*4+l*FONT_WIDTH; } if (height<0) height=BTTN_BORDER*4+FONT_HEIGHT; res=CAlloc(sizeof(CCtrl)); if (_s) { s=_s; MemSet(s,0,sizeof(CCtrlBttnState)); } else { s=CAlloc(sizeof(CCtrlBttnState)); s->flags=BTF_DONT_FREE; } s->num_states=num_states; s->state_texts=state_texts; s->state_colors=state_colors; res->win_task=Fs; res->flags=CTRLF_SHOW; res->type=CTRLT_GENERIC; res->state=s; res->draw_it=&DrawCtrlBttn; res->left_click=&LeftClickCtrlBttn; res->left=x; res->top=y; res->right=res->left+width-1; res->bottom=res->top+height-1; QueIns(res,Fs->last_ctrl); return res; } public U0 CtrlBttnDel(CCtrl *c) {//Free bttn ctrl. QueRem(c); if (!(c->flags&BTF_DONT_FREE)) Free(c->state); Free(c); }