void wxControlRenderer::DrawProgressBar(const wxGauge *gauge) { // draw background m_dc.SetBrush(m_window->GetBackgroundColour()); m_dc.SetPen(*wxTRANSPARENT_PEN); m_dc.DrawRectangle(m_rect); int max = gauge->GetRange(); if ( !max ) { // nothing to draw return; } // calc the filled rect int pos = gauge->GetValue(); int left = max - pos; wxRect rect = m_rect; rect.Deflate(1); // FIXME this depends on the border width wxColour col = m_window->UseFgCol() ? m_window->GetForegroundColour() : wxTHEME_COLOUR(GAUGE); m_dc.SetBrush(col); if ( gauge->IsSmooth() ) { // just draw the rectangle in one go if ( gauge->IsVertical() ) { // vert bars grow from bottom to top wxCoord dy = ((rect.height - 1) * left) / max; rect.y += dy; rect.height -= dy; } else // horizontal { // grow from left to right rect.width -= ((rect.width - 1) * left) / max; } m_dc.DrawRectangle(rect); } else // discrete { wxSize sizeStep = m_renderer->GetProgressBarStep(); int step = gauge->IsVertical() ? sizeStep.y : sizeStep.x; // we divide by it below! wxCHECK_RET( step, wxT("invalid wxGauge step") ); // round up to make the progress appear to start faster int lenTotal = gauge->IsVertical() ? rect.height : rect.width; int steps = ((lenTotal + step - 1) * pos) / (max * step); // calc the coords of one small rect wxCoord *px; wxCoord dx, dy; if ( gauge->IsVertical() ) { // draw from bottom to top: so first set y to the bottom rect.y += rect.height - 1; // then adjust the height rect.height = step; // and then adjust y again to be what it should for the first rect rect.y -= rect.height; // we are going up step = -step; // remember that this will be the coord which will change px = &rect.y; dy = 1; dx = 0; } else // horizontal { // don't leave 2 empty pixels in the beginning rect.x--; px = &rect.x; rect.width = step; dy = 0; dx = 1; } for ( int n = 0; n < steps; n++ ) { wxRect rectSegment = rect; rectSegment.Deflate(dx, dy); m_dc.DrawRectangle(rectSegment); *px += step; if ( *px < 1 ) { // this can only happen for the last step of vertical gauge rect.height = *px - step - 1; *px = 1; } else if ( *px > lenTotal - step ) { // this can only happen for the last step of horizontal gauge rect.width = lenTotal - *px - 1; } } } }
wxRootWindow() : wxWindow(NULL, wxID_ANY) { SetMGLwindow_t(MGL_wmGetRootWindow(g_winMng)); SetBackgroundColour(wxTHEME_COLOUR(DESKTOP)); }