我有一个TStringGrid
,其单元格使用OnDrawCell
事件获得自定义背景颜色。现在我想在视觉上将每一行扩展到网格ClientRect
的右端,即删除不再有列的空格。
我考虑使用额外的“幻像”列并不断调整其ColWidth
,但该黑客不适用于网格有点笨拙的垂直滚动行为。我首选的解决方案是简单地绘制该区域。
计算相关的矩形很容易,但我画的内容会立即被删除。我已停用DefaultDrawing
并删除了所有选项goFixedVertLine
,goFixedHorzLine
,goVertLine
和goHorzLine
,但无效。
以下是一些示例代码:
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
方法并实现使用此事件已经可用的大部分内容。
答案 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); // <--