void AColor::BevelTrackInfo(wxDC & dc, bool up, const wxRect & r) { #ifndef EXPERIMENTAL_THEMING Bevel( dc, up, r ); #else wxColour col; col = Blend( theTheme.Colour( clrTrackInfo ), up ? wxColour( 255,255,255):wxColour(0,0,0)); wxPen pen( col ); dc.SetPen( pen ); dc.DrawLine(r.x, r.y, r.x + r.width, r.y); dc.DrawLine(r.x, r.y, r.x, r.y + r.height); col = Blend( theTheme.Colour( clrTrackInfo ), up ? wxColour(0,0,0): wxColour(255,255,255)); pen.SetColour( col ); dc.SetPen( pen ); dc.DrawLine(r.x + r.width, r.y, r.x + r.width, r.y + r.height); dc.DrawLine(r.x, r.y + r.height, r.x + r.width + 1, r.y + r.height); #endif }
/********************************************************************* * Function: WORD GOLPanelDrawTsk(void) * * PreCondition: parameters must be set with * GOLRndPanelDraw(x,y,radius,width,height,faceClr,embossLtClr, * embossDkClr,pBitmap,embossSize) * * Input: None * * Output: Output: non-zero if drawing is completed * * Overview: draws a rounded panel on screen. Must be called repeatedly. Drawing is done * when it returns non-zero. * * Note: none * ********************************************************************/ WORD GOLPanelDrawTsk(void) { #ifndef USE_NONBLOCKING_CONFIG WORD counter; // check if we need to draw the panels and emboss sides if ( (_pRpnlBitmap == NULL) || ( ((_rpnlX2 - _rpnlX1 + (_rpnlR<<1)) > GetImageWidth((void *)_pRpnlBitmap)) && ((_rpnlY2 - _rpnlY1 + (_rpnlR<<1)) > GetImageHeight((void *)_pRpnlBitmap)) && (_pRpnlBitmap != NULL) ) ) { if(_rpnlR) { // draw upper left portion of the embossed area SetColor(_rpnlEmbossLtColor); Arc(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR - _rpnlEmbossSize, _rpnlR, 0xE1); // draw lower right portion of the embossed area SetColor(_rpnlEmbossDkColor); Arc(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR - _rpnlEmbossSize, _rpnlR, 0x1E); } else { // object is rectangular panel draw the embossed areas counter = 1; SetColor(_rpnlEmbossLtColor); while(counter < _rpnlEmbossSize) { Bar(_rpnlX1 + counter, _rpnlY1 + counter, _rpnlX2 - counter, _rpnlY1 + counter); // draw top Bar(_rpnlX1 + counter, _rpnlY1 + counter, _rpnlX1 + counter, _rpnlY2 - counter); // draw left counter++; } counter = 1; SetColor(_rpnlEmbossDkColor); while(counter < _rpnlEmbossSize) { Bar(_rpnlX1 + counter, _rpnlY2 - counter, _rpnlX2 - counter, _rpnlY2 - counter); // draw bottom Bar(_rpnlX2 - counter, _rpnlY1 + counter, _rpnlX2 - counter, _rpnlY2 - counter); // draw right counter++; } } // draw the face color SetColor(_rpnlFaceColor); #ifdef USE_ALPHABLEND_LITE // set alpha value SetAlpha(_rpnlAlpha); #endif if(_rpnlR) #ifdef USE_GRADIENT if(_gradientScheme.gradientType != GRAD_NONE) { BevelGradient(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR - _rpnlEmbossSize, _gradientScheme.gradientStartColor,_gradientScheme.gradientEndColor, _gradientScheme.gradientLength,_gradientScheme.gradientType); } else #endif FillBevel(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR - _rpnlEmbossSize); else { Bar(_rpnlX1 + _rpnlEmbossSize, _rpnlY1 + _rpnlEmbossSize, _rpnlX2 - _rpnlEmbossSize, _rpnlY2 - _rpnlEmbossSize); } #if (COLOR_DEPTH == 1) if(_rpnlFaceColor == _rpnlEmbossDkColor) { SetColor(_rpnlEmbossLtColor); if(_rpnlR) Bevel(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR - (_rpnlEmbossSize - 1)); else Bevel ( _rpnlX1 + (_rpnlEmbossSize - 1), _rpnlY1 + (_rpnlEmbossSize - 1), _rpnlX2 - (_rpnlEmbossSize - 1), _rpnlY2 - (_rpnlEmbossSize - 1), 0 ); } #endif } // end of check if we need to draw the panels and emboss sides // draw bitmap if(_pRpnlBitmap != NULL) { PutImage ( (((_rpnlX2 + _rpnlX1) - (GetImageWidth((void *)_pRpnlBitmap))) >> 1) + 1, (((_rpnlY2 + _rpnlY1) - (GetImageHeight((void *)_pRpnlBitmap))) >> 1) + 1, _pRpnlBitmap, IMAGE_NORMAL ); }
/********************************************************************* * Function: WORD BtnDraw(BUTTON *pB) * * * Notes: This is the state machine to draw the button. * ********************************************************************/ WORD BtnDraw(BUTTON *pB) { typedef enum { REMOVE, BEVEL_DRAW, RNDBUTTON_DRAW, TEXT_DRAW, TEXT_DRAW_RUN, FOCUS_DRAW, } BTN_DRAW_STATES; static BTN_DRAW_STATES state = REMOVE; static SHORT width, height, radius; WORD faceClr, embossLtClr, embossDkClr, xText, yText; if(IsDeviceBusy()) return 0; switch(state){ case REMOVE: if(IsDeviceBusy()) return 0; if (GetState(pB,BTN_HIDE)) { // Hide the button (remove from screen) SetColor(pB->hdr.pGolScheme->CommonBkColor); Bar(pB->hdr.left, pB->hdr.top, pB->hdr.right, pB->hdr.bottom); return 1; } /* Note: that width and height adjustment considers the following assumptions: 1. if circular width = height = radius*2 2. if vertical capsule width = radius*2 3. if horizontal capsule height = radius*2 4. radius must be less than or equal to width if height is greater than width 5. radius must be less than or equal to height if width is greater than height 6. if button is cornered, radius must be zero */ radius = pB->radius; // get radius width = (pB->hdr.right - pB->hdr.left) - (radius*2); // get width height = (pB->hdr.bottom - pB->hdr.top) - (radius*2); // get height state = BEVEL_DRAW; case BEVEL_DRAW: if(!GetState(pB,BTN_DISABLED)){ if(GetState(pB,BTN_PRESSED)){ embossDkClr = pB->hdr.pGolScheme->EmbossLtColor; embossLtClr = pB->hdr.pGolScheme->EmbossDkColor; faceClr = pB->hdr.pGolScheme->Color1; } else { embossLtClr = pB->hdr.pGolScheme->EmbossLtColor; embossDkClr = pB->hdr.pGolScheme->EmbossDkColor; faceClr = pB->hdr.pGolScheme->Color0; } }else{ embossLtClr = pB->hdr.pGolScheme->EmbossLtColor; embossDkClr = pB->hdr.pGolScheme->EmbossDkColor; faceClr = pB->hdr.pGolScheme->ColorDisabled; } SetLineThickness(NORMAL_LINE); SetLineType(SOLID_LINE); GOLPanelDraw(pB->hdr.left+radius, pB->hdr.top+radius, pB->hdr.right-radius, pB->hdr.bottom-radius, radius, faceClr, embossLtClr, embossDkClr, pB->pBitmap, GOL_EMBOSS_SIZE); state = RNDBUTTON_DRAW; case RNDBUTTON_DRAW: if(!GOLPanelDrawTsk()){ return 0; } state = TEXT_DRAW; case TEXT_DRAW: if (pB->pText != NULL){ if (!GetState(pB,BTN_DISABLED)){ if (GetState(pB,BTN_PRESSED)){ SetColor(pB->hdr.pGolScheme->TextColor1); }else{ SetColor(pB->hdr.pGolScheme->TextColor0); } } else{ SetColor(pB->hdr.pGolScheme->TextColorDisabled); } SetFont(pB->hdr.pGolScheme->pFont); // check text alignment if (GetState(pB, BTN_TEXTRIGHT)) xText = pB->hdr.right-(pB->textWidth+GOL_EMBOSS_SIZE+2); else if (GetState(pB, BTN_TEXTLEFT)) xText = pB->hdr.left+GOL_EMBOSS_SIZE+2; else xText = (pB->hdr.left+pB->hdr.right-pB->textWidth)>>1; if (GetState(pB, BTN_TEXTTOP)) yText = pB->hdr.top+GOL_EMBOSS_SIZE+2; else if (GetState(pB, BTN_TEXTBOTTOM)) yText = pB->hdr.bottom-(pB->textHeight+GOL_EMBOSS_SIZE); else yText = (pB->hdr.bottom+pB->hdr.top-pB->textHeight)>>1; MoveTo(xText, yText); state = TEXT_DRAW_RUN; }else { state = FOCUS_DRAW; goto rnd_button_draw_focus; } case TEXT_DRAW_RUN: if(!OutText(pB->pText)) return 0; state = FOCUS_DRAW; case FOCUS_DRAW: rnd_button_draw_focus: if(IsDeviceBusy()) return 0; if(GetState(pB,BTN_FOCUSED)){ SetLineType(FOCUS_LINE); if(GetState(pB,BTN_PRESSED)) { SetColor(pB->hdr.pGolScheme->TextColor1); } else { SetColor(pB->hdr.pGolScheme->TextColor0); } // check if the object has rounded corners or not if (!pB->radius) { Rectangle( pB->hdr.left+GOL_EMBOSS_SIZE+2 , pB->hdr.top+GOL_EMBOSS_SIZE+2, pB->hdr.right-GOL_EMBOSS_SIZE-2, pB->hdr.bottom-GOL_EMBOSS_SIZE-2); } else { // original center is still the same, but radius is reduced Bevel( pB->hdr.left+radius, pB->hdr.top+radius, \ pB->hdr.right-radius, pB->hdr.bottom-radius, \ radius - 2 - GOL_EMBOSS_SIZE); } SetLineType(SOLID_LINE); } state = REMOVE; return 1; }
/********************************************************************* * Function: WORD GOLPanelDrawTsk(void) * * PreCondition: parameters must be set with * GOLRndPanelDraw(x,y,radius,width,height,faceClr,embossLtClr, * embossDkClr,pBitmap,embossSize) * * Input: None * * Output: Output: non-zero if drawing is completed * * Overview: draws a rounded panel on screen. Must be called repeatedly. Drawing is done * when it returns non-zero. * * Note: none * ********************************************************************/ WORD GOLPanelDrawTsk(void) { //#define SIN45 46341 #ifndef USE_NONBLOCKING_CONFIG WORD counter; if (_rpnlR) { // draw upper left portion of the embossed area SetColor(_rpnlEmbossLtColor); Arc(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR-_rpnlEmbossSize, _rpnlR, 0xE1); // draw lower right portion of the embossed area SetColor(_rpnlEmbossDkColor); Arc(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR-_rpnlEmbossSize, _rpnlR, 0x1E); } else { // object is rectangular panel draw the embossed areas counter = 1; SetColor(_rpnlEmbossLtColor); while(counter < _rpnlEmbossSize){ Bar( _rpnlX1+counter, _rpnlY1+counter, _rpnlX2-counter, _rpnlY1+counter); // draw top Bar( _rpnlX1+counter, _rpnlY1+counter, _rpnlX1+counter, _rpnlY2-counter); // draw left counter++; } counter = 1; SetColor(_rpnlEmbossDkColor); while(counter < _rpnlEmbossSize){ Bar( _rpnlX1+counter, _rpnlY2-counter, _rpnlX2-counter, _rpnlY2-counter); // draw bottom Bar( _rpnlX2-counter, _rpnlY1+counter, _rpnlX2-counter, _rpnlY2-counter); // draw right counter++; } } // draw bitmap if(_pRpnlBitmap != NULL) { if (!(_rpnlX2-_rpnlX1) && (_rpnlY2-_rpnlY1)) { // vertical capsule PutImage(_rpnlX1-(_rpnlR-_rpnlEmbossSize), _rpnlY1, _pRpnlBitmap,IMAGE_NORMAL); } else if ((_rpnlX2-_rpnlX1) && !(_rpnlY2-_rpnlY1)) { // horizontal capsule PutImage(_rpnlX1, _rpnlY1-(_rpnlR-_rpnlEmbossSize), _pRpnlBitmap,IMAGE_NORMAL); } else if ((_rpnlX2-_rpnlX1) && (_rpnlY2-_rpnlY1)) { if (_rpnlR) { // beveled PutImage(_rpnlX1, _rpnlY1, _pRpnlBitmap,IMAGE_NORMAL); } else { // square PutImage(_rpnlX1+_rpnlEmbossSize, _rpnlY1+_rpnlEmbossSize, _pRpnlBitmap,IMAGE_NORMAL); } } else if (!(_rpnlX2-_rpnlX1) && !(_rpnlY2-_rpnlY1)) { // circular PutImage(_rpnlX1-(_rpnlR-_rpnlEmbossSize), _rpnlY1-(_rpnlR-_rpnlEmbossSize), _pRpnlBitmap,IMAGE_NORMAL); } } else { // draw the face color SetColor(_rpnlFaceColor); if (_rpnlR) FillBevel(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR-_rpnlEmbossSize); else Bar(_rpnlX1+_rpnlEmbossSize, _rpnlY1+_rpnlEmbossSize, _rpnlX2-_rpnlEmbossSize, _rpnlY2-_rpnlEmbossSize); #ifdef USE_MONOCHROME if (_rpnlFaceColor == BLACK) { SetColor(WHITE); if (_rpnlR) Bevel(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR-(_rpnlEmbossSize-1)); else Bevel(_rpnlX1+(_rpnlEmbossSize-1), _rpnlY1+(_rpnlEmbossSize-1), _rpnlX2-(_rpnlEmbossSize-1), _rpnlY2-(_rpnlEmbossSize-1), 0); } #endif } // draw the outline SetColor(_rpnlEmbossDkColor); Bevel(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR); return 1; #else typedef enum { BEGIN, ARC1, DRAW_EMBOSS1, DRAW_EMBOSS2, DRAW_EMBOSS3, DRAW_EMBOSS4, DRAW_FACECOLOR, #ifdef USE_MONOCHROME DRAW_INNERFRAME, #endif DRAW_FRAME, } ROUND_PANEL_DRAW_STATES; static ROUND_PANEL_DRAW_STATES state = BEGIN; static WORD counter; while(1){ if(IsDeviceBusy()) return 0; switch(state){ case BEGIN: if (_rpnlR) { // draw upper left portion of the embossed area SetColor(_rpnlEmbossLtColor); if (!Arc(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR-_rpnlEmbossSize, _rpnlR, 0xE1)) return 0; state = ARC1; } else { state = DRAW_EMBOSS1; goto rnd_panel_draw_emboss; } case ARC1: // draw upper left portion of the embossed area SetColor(_rpnlEmbossDkColor); if (!Arc(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR-_rpnlEmbossSize, _rpnlR, 0x1E)) return 0; state = DRAW_FACECOLOR; goto rnd_panel_draw_facecolor; // now draw the upper portion of the embossed area case DRAW_EMBOSS1: rnd_panel_draw_emboss: SetColor(_rpnlEmbossLtColor); counter = 1; while(counter < _rpnlEmbossSize){ if(IsDeviceBusy()) return 0; // draw top Bar( _rpnlX1+counter, _rpnlY1+counter, \ _rpnlX2-counter, _rpnlY1+counter); counter++; } counter = 1; state = DRAW_EMBOSS2; break; case DRAW_EMBOSS2: while(counter < _rpnlEmbossSize){ if(IsDeviceBusy()) return 0; // draw left Bar( _rpnlX1+counter, _rpnlY1+counter, \ _rpnlX1+counter, _rpnlY2-counter); counter++; } counter = 1; state = DRAW_EMBOSS3; break; // now draw the lower portion of the embossed area case DRAW_EMBOSS3: SetColor(_rpnlEmbossDkColor); while(counter < _rpnlEmbossSize){ if(IsDeviceBusy()) return 0; // draw bottom Bar( _rpnlX1+counter, _rpnlY2-counter, \ _rpnlX2-counter, _rpnlY2-counter); counter++; } counter = 1; state = DRAW_EMBOSS4; break; case DRAW_EMBOSS4: while(counter < _rpnlEmbossSize){ if(IsDeviceBusy()) return 0; // draw right Bar( _rpnlX2-counter, _rpnlY1+counter, \ _rpnlX2-counter, _rpnlY2-counter); counter++; } state = DRAW_FACECOLOR; break; // draw the face color case DRAW_FACECOLOR: rnd_panel_draw_facecolor: if(_pRpnlBitmap != NULL) { if (!(_rpnlX2-_rpnlX1) && (_rpnlY2-_rpnlY1)) // vertical capsule PutImage(_rpnlX1-(_rpnlR-_rpnlEmbossSize), _rpnlY1, _pRpnlBitmap,IMAGE_NORMAL); else if ((_rpnlX2-_rpnlX1) && !(_rpnlY2-_rpnlY1)) // horizontal capsule PutImage(_rpnlX1, _rpnlY1-(_rpnlR-_rpnlEmbossSize), _pRpnlBitmap,IMAGE_NORMAL); else if ((_rpnlX2-_rpnlX1) && (_rpnlY2-_rpnlY1)) { if (_rpnlR) // beveled PutImage(_rpnlX1, _rpnlY1, _pRpnlBitmap,IMAGE_NORMAL); else // square PutImage(_rpnlX1+_rpnlEmbossSize, _rpnlY1+_rpnlEmbossSize, _pRpnlBitmap,IMAGE_NORMAL); } else if (!(_rpnlX2-_rpnlX1) && !(_rpnlY2-_rpnlY1)) // circular PutImage(_rpnlX1-(_rpnlR-_rpnlEmbossSize), _rpnlY1-(_rpnlR-_rpnlEmbossSize), _pRpnlBitmap,IMAGE_NORMAL); } else { SetColor(_rpnlFaceColor); if (_rpnlR) { if (!FillBevel(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR-_rpnlEmbossSize)) return 0; } else { Bar(_rpnlX1+_rpnlEmbossSize, _rpnlY1+_rpnlEmbossSize, \ _rpnlX2-_rpnlEmbossSize, _rpnlY2-_rpnlEmbossSize); } #ifdef USE_MONOCHROME state = DRAW_INNERFRAME; break; #endif } state = DRAW_FRAME; break; #ifdef USE_MONOCHROME case DRAW_INNERFRAME: if (_rpnlFaceColor == BLACK) { SetColor(WHITE); if (_rpnlR) Bevel(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR-(_rpnlEmbossSize-1)); else Bevel(_rpnlX1+(_rpnlEmbossSize-1), _rpnlY1+(_rpnlEmbossSize-1), _rpnlX2-(_rpnlEmbossSize-1), _rpnlY2-(_rpnlEmbossSize-1), 0); } state = DRAW_FRAME; break; #endif case DRAW_FRAME: // draw the outline frame #ifdef USE_MONOCHROME SetColor(WHITE); #else SetColor(_rpnlEmbossDkColor); #endif Bevel(_rpnlX1, _rpnlY1, _rpnlX2, _rpnlY2, _rpnlR); state = BEGIN; return 1; }// end of switch }// end of while #endif //#ifndef USE_NONBLOCKING_CONFIG }