WinForms TableLayoutPanel首列单元格绘制外侧弧形异常求助
WinForms TableLayoutPanel首列单元格绘制外侧弧形异常求助
嘿,我看你在给WinForms的TableLayoutPanel首列单元格画外侧弧形时遇到了显示不一致的问题,结合你贴的代码,我来帮你捋捋问题出在哪,以及怎么调整~
首先,你当前的代码里有几个可能导致异常的点:
- 你用了单元格的Bounds(也就是
r)来绘制AddArc,如果不同行的单元格宽高不一样,这个弧形会变成椭圆弧,自然每行的输出就会有差异 - 路径的线段顺序和Arc的角度参数搭配得不太对,导致闭合后的图形和你预期的“外侧弧形”形状不符
- 没有开启图形平滑,绘制出来的弧形边缘会有锯齿,看起来也会有种“异常”的视觉效果
接下来给你修正后的代码,我会加上注释说明调整的细节:
this.tlp_tra_actual.CellPaint += tableLayoutPanel1_CellPaint; void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e) { if (e.Column == 0) { Graphics g = e.Graphics; // 开启抗锯齿,让弧形边缘更平滑自然 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; Rectangle cellRect = e.CellBounds; // 缩小单元格边界1像素,避免和相邻单元格的绘制区域重叠 cellRect.Inflate(-1, -1); // 用单元格的高度作为正圆直径,保证所有行的弧形都是统一的正半圆 int arcDiameter = cellRect.Height; // 把弧形的正方形定位在单元格左侧外侧,让弧形向左凸(也就是你要的外侧效果) Rectangle arcRect = new Rectangle( cellRect.X - arcDiameter / 2, // 向左偏移半圆半径,让弧形中心对齐单元格左侧边缘 cellRect.Y, arcDiameter, arcDiameter ); using (GraphicsPath gp = new GraphicsPath()) { gp.StartFigure(); // 从单元格右上角画到右下角,补全右侧竖边 gp.AddLine(cellRect.Right, cellRect.Top, cellRect.Right, cellRect.Bottom); // 从右下角画到单元格左下角,补全底部横边 gp.AddLine(cellRect.Right, cellRect.Bottom, cellRect.Left, cellRect.Bottom); // 绘制向左凸的正半圆:从左下角到左上角,90度是向下方向,顺时针转180度到向上方向 gp.AddArc(arcRect, 90, 180); // 从弧形的左上端点回到单元格左上角,补全顶部横边 gp.AddLine(cellRect.Left, cellRect.Top, cellRect.Right, cellRect.Top); gp.CloseFigure(); } g.FillPath(Brushes.Blue, gp); } }
如果你的需求不是向左凸的外侧弧形,而是比如顶部向外凸,只需要调整arcRect的位置和AddArc的角度参数:
- 顶部外凸的话,
arcRect的Y坐标要向上偏移arcDiameter/2,AddArc的角度改成180, 180就行
最后再给你几个小建议:
- 尽量不要用硬编码的
+1、-1来调整坐标,用变量或者单元格的属性计算,适配不同大小的单元格会更灵活 - 可以先在纸上画一下你想要的路径线段顺序,再对应到
AddLine和AddArc的调用,这样更容易理清逻辑 - 绘制图形时记得开启抗锯齿,视觉体验会好很多
内容来源于stack exchange
相关产品推荐
相关产品推荐

