我喜欢在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个单元格或多个单元格设置合并渐变。
答案 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控件有任何滚动条。
结果:
对于任何闪烁问题,请尝试从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);
}
}