在C1FlexGrid中的单元格上显示DrawImage、FillRectangle和DrawCell

本文关键字:DrawImage FillRectangle DrawCell 显示 C1FlexGrid 单元格 | 更新日期: 2023-09-27 18:28:28

当我需要设置背景色、绘制图像和填充宽边框的矩形时,我很难在C1FlexGrid中正确渲染单元格。我似乎无法为每个单元格正确绘制DrawCell、DrawImage和FillRectangle的组合。

"OwnerDrawCell"事件是我绘制内容、边框和图像的地方。

首先,我将每个细胞的细胞背景颜色设置为这样的颜色:

e.Style.BackColor = lockedBackColor;

然后,对于一些单元格,我正在绘制图像和文本。

// CENTER TEXT IN CELL; IMAGE IS RIGHT JUSTIFIED, CENTERED VERTICALLY
// Must draw cell first - background color, borders, etc..
e.DrawCell(DrawCellFlags.Background | DrawCellFlags.Border);
// Draw cell text
int textWidth = (int)e.Graphics.MeasureString(e.Text, e.Style.Font).Width;
int textHeight = (int)e.Graphics.MeasureString(e.Text, e.Style.Font).Height;
float textCenterX = e.Bounds.Left + ((e.Bounds.Width - textWidth) / 2);
float textCenterY = e.Bounds.Top + ((e.Bounds.Height - textHeight) / 2);
e.Graphics.DrawString(e.Text, e.Style.Font, brushColorForString, textCenterX, textCenterY);
if (e.Row == 8 || PlantHasBins())
{
    // Draw cell image
    int cellImageX = e.Bounds.Right - _cellImage.Width;
    int cellImageY = e.Bounds.Top + ((e.Bounds.Height - _cellImage.Height) / 2);
    var cellImagePoint = new Point(cellImageX, cellImageY);
    e.Graphics.DrawImage(_cellImage, cellImagePoint);
}
e.Handled = true;

然后,对于一些列,我想画一个沉重的右边框,以便在列组之间进行视觉分隔。

e.DrawCell(DrawCellFlags.Border);
Rectangle rc;
Margins m = new Margins(0, 0, 0, 0);
m.Right = 3;
CellRange rg;
rg = PlantAlleyBinGrid.GetCellRange(e.Row, e.Col);
rc = e.Bounds;
rg.c1 = rg.c2 = 2 + 1;
rg.c1 = rg.c2 = 2;
rc.X = rc.Right - m.Right;
rc.Width = m.Right;
e.Graphics.FillRectangle(new SolidBrush(Color.Black), rc);
e.Handled = true;

编写的代码就快到了。我尝试了许多替代方案和流程,但最终没有绘制单元格图像、单元格边界、单元格内容或其任何组合。

我需要关于如何在单元格上绘制所有内容的帮助。

在C1FlexGrid中的单元格上显示DrawImage、FillRectangle和DrawCell

我通过为不绘制图像的单元格调用DrawCell和DrawString来解决这个问题。