在TableLayoutPanel中为多个单元格绘制渐变

时间:2014-03-25 22:58:33

标签: c# winforms tablelayoutpanel

我喜欢在tablelayoutpanel中绘制多个单元格。我知道如何绘制行和列作为下面的常规代码:

private void tableLayoutPane1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
  if (e.Row == 3 || e.Row == 4 || e.Row == 5)
  { 
    LinearGradientBrush brush = new LinearGradientBrush(e.CellBounds, Color.White,   Color.Transparent, 90F);
    e.Graphics.FillRectangle(brush, e.CellBounds);
  }
}

但我想为3个单元格或行创建一个矩形渐变,另一个为3个单元格或多个单元格设置合并渐变。

3 个答案:

答案 0 :(得分:1)

这可以通过使用Paint事件而不是CellPaint事件来完成。诀窍是找出表中每个单元格的位置。 Intellisense(GetRowHeights()GetColumnWidths())隐藏了两个功能,可以获得行高和列宽,因此您可以自己计算位置:

void tlp_Paint(object sender, PaintEventArgs e) {
  int[] rowHeights = tlp.GetRowHeights();
  int[] colmWidths = tlp.GetColumnWidths();

  int boxLeft = 0;
  int boxTop = 0;
  int boxRight = 0;
  int boxBottom = 0;

  Rectangle r = Rectangle.Empty;
  for (int y = 0; y < rowHeights.Length; ++y) {
    boxLeft = 0;
    boxRight = 0;
    boxBottom += rowHeights[y];
    for (int x = 0; x < colmWidths.Length; ++x) {
      boxRight += colmWidths[x];
      if (x == 1 && y == 3) {
        r.X = boxLeft;
        r.Y = boxTop;
      }
      if (x == 2 && y == 5) {
        r.Width = boxRight - r.Left;
        r.Height = boxBottom - r.Top;
      }
      boxLeft += colmWidths[x];
    }
    boxTop += rowHeights[y];
  }

  if (!r.IsEmpty) {
    e.Graphics.TranslateTransform(tlp.AutoScrollPosition.X,
                                  tlp.AutoScrollPosition.Y);
    using (var br = new LinearGradientBrush(
                          r,
                          Color.Red,
                          Color.Black,
                          LinearGradientMode.ForwardDiagonal)) {
      e.Graphics.FillRectangle(br, r);
    }
  }
}

我已经包含了对e.Graphics.TranslateTransform的调用,以防TableLayoutPanel控件有任何滚动条。

结果:

enter image description here

对于任何闪烁问题,请尝试从TableLayoutPanel继承,以便将其DoubleBuffered属性设置为true。

答案 1 :(得分:0)

概念回答

单独设置每个单元格。第一个单元格应该类似于渐变的前三分之一,第二个单元格应该类似于中间部分,依此类推。

使用System.Drawing.Color.FromArgb(int,int,int,int)手动设置颜色,或者使用其中一个最适合的重载

您的代码结构会发生一些变化:

if(first cell)...
if(second cell)...

希望我可以提供更多帮助,但自从我玩winforms以来,我一直渴望得到它。

另一种方法是将您的单元格绘制为透明,并使用您想要的渐变在其后面绘制适当大小的矩形。

抱歉,我没有真正的代码。

答案 2 :(得分:0)

我已经找到了这个问题的解决方案,下面是短代码:

int x, y, w, h;

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
  if (e.Row == 1 && e.Column == 0)
  {
    x = e.CellBounds.X;
    y = e.CellBounds.Y;
    w = e.CellBounds.Width;
    h = e.CellBounds.Height;
  }

  if (e.Row == 2 && e.Column == 0)
  {
    h = h + e.CellBounds.Height;
  }

  if (e.Row == 1 && e.Column == 1)
  {
    w = w + e.CellBounds.Width;
  }

  if (e.Row == 3 && e.Column == 3)
  {
    Rectangle rc = new Rectangle(x, y, w, h);
    LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.White, LinearGradientMode.Vertical);
    e.Graphics.FillRectangle(brush, rc);
  }
}