void TScrollBar::GetThumb(TRect& r) const { if (fMinimum < fMaximum) { GetThumbArea(r); if (IsVertical()) { TCoord available = r.GetHeight(); if (available > kMinThumbSize) { TCoord thumbSize; if (fProportionalThumbs) thumbSize = ((long long)fBounds.GetHeight() * (long long)available) / (long long)(fMaximum - fMinimum + fBounds.GetHeight()); else thumbSize = fBounds.GetWidth(); if (thumbSize < kMinThumbSize) thumbSize = kMinThumbSize; else if (thumbSize > available) thumbSize = available; available -= thumbSize; r.top += (int)(((long long)(fValue - fMinimum) * (long long)available) / (long long)(fMaximum - fMinimum)); r.bottom = r.top + thumbSize; } } else { TCoord available = r.GetWidth(); if (available > kMinThumbSize) { TCoord thumbSize; if (fProportionalThumbs) thumbSize = ((long long)fBounds.GetWidth() * (long long)available) / (long long)(fMaximum - fMinimum + fBounds.GetWidth()); else thumbSize = fBounds.GetHeight(); if (thumbSize < kMinThumbSize) thumbSize = kMinThumbSize; else if (thumbSize > available) thumbSize = available; available -= thumbSize; r.left += (int)(((long long)(fValue - fMinimum) * (long long)available) / (long long)(fMaximum - fMinimum)); r.right = r.left + thumbSize; } } } else r.SetEmpty(); }
// /// Tiles the gadgets in the direction requested (horizontal or vertical). Derived /// classes can adjust the spacing between gadgets. /// /// Horizontal direction results in a row-major layout, /// and vertical direction results in column-major layout // TRect TToolBox::TileGadgets() { TSize cellSize; ComputeCellSize(cellSize); int numRows, numColumns; ComputeNumRowsColumns(numRows, numColumns); TRect innerRect; GetInnerRect(innerRect); TRect invalidRect; invalidRect.SetEmpty(); if (Direction == Horizontal) { // Row Major // int y = innerRect.top; TGadget* g = Gadgets; for (int r = 0; r < numRows; r++) { int x = innerRect.left; for (int c = 0; c < numColumns && g; c++) { TRect bounds(TPoint(x, y), cellSize); TRect originalBounds(g->GetBounds()); if (bounds != g->GetBounds()) { g->SetBounds(bounds); if (invalidRect.IsNull()) invalidRect = bounds; else invalidRect |= bounds; if (originalBounds.TopLeft() != TPoint(0, 0)) invalidRect |= originalBounds; } x += cellSize.cx; g = g->NextGadget(); } y += cellSize.cy; } } else { // Column Major // int x = innerRect.left; TGadget* g = Gadgets; for (int c = 0; c < numColumns; c++) { int y = innerRect.top; for (int r = 0; r < numRows && g; r++) { TRect bounds(TPoint(x, y), cellSize); TRect originalBounds(g->GetBounds()); if (bounds != originalBounds) { g->SetBounds(bounds); if (invalidRect.IsNull()) invalidRect = bounds; else invalidRect |= bounds; if (originalBounds.TopLeft() != TPoint(0, 0)) invalidRect |= originalBounds; } y += cellSize.cy; g = g->NextGadget(); } x += cellSize.cx; } } return invalidRect; }