如何在TStringGrid.OnDrawCell中绘制单元格外?

时间:2016-07-09 19:24:23

标签: delphi delphi-2010 vcl

我有一个TStringGrid,其单元格使用OnDrawCell事件获得自定义背景颜色。现在我想在视觉上将每一行扩展到网格ClientRect的右端,即删除不再有列的空格。

我考虑使用额外的“幻像”列并不断调整其ColWidth,但该黑客不适用于网格有点笨拙的垂直滚动行为。我首选的解决方案是简单地绘制该区域。

计算相关的矩形很容易,但我画的内容会立即被删除。我已停用DefaultDrawing并删除了所有选项goFixedVertLinegoFixedHorzLinegoVertLinegoHorzLine,但无效。

以下是一些示例代码:

LGrid := TStringGrid(Sender);
LGrid.Canvas.Brush.Color := clYellow + 1000 * (1 + ARow);
if ACol = LGrid.ColCount - 1 then
  Rect.Right := LGrid.ClientRect.Right; // Doesn't have any effect
LGrid.Canvas.FillRect(Rect);

实现上述代码的最简单方法是什么?我希望在某种程度上可以在不编写插入器类的情况下进行绘制,覆盖Paint方法并实现使用此事件已经可用的大部分内容。

1 个答案:

答案 0 :(得分:1)

在完成单元格绘制后,VCL填充未被单元格占用的空白区域。这就是为什么你的画得过度了。可以使用OnDrawCell事件处理程序立即阻止您绘制的内容被删除,无需覆盖Paint或派生新控件。

由于VCL使用相同的设备上下文绘制单元格和空白区域,因此您可以剪切出刚从设备上下文中提取的扩展矩形,操作系统将忽略VCL稍后对该区域的绘制调用。

LGrid := TStringGrid(Sender);
LGrid.Canvas.Brush.Color := clYellow + 1000 * (1 + ARow);
if ACol = LGrid.ColCount - 1 then
  Rect.Right := LGrid.ClientRect.Right;
LGrid.Canvas.FillRect(Rect);
ExcludeClipRect(LGrid.Canvas.Handle, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);  // <--