gpt4 book ai didi

delphi - 如何在TStringGrid.OnDrawCell中的单元格外部绘制?

转载 作者:行者123 更新时间:2023-12-03 15:55:57 25 4
gpt4 key购买 nike

我有一个 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 方法并使用此事件实现我已经可用的大部分内容的情况下在那里进行绘制。

最佳答案

单元格绘制完成后,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); // <--

关于delphi - 如何在TStringGrid.OnDrawCell中的单元格外部绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38285531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com