示例#1
0
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();
}
示例#2
0
//
/// 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;
}