- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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
方法并使用此事件实现我已经可用的大部分内容的情况下在那里进行绘制。
最佳答案
单元格绘制完成后,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/
我正在尝试使 StringGrid 中的文本居中。经过一番研究,我想出了这个由其他人发布的函数,当在 DefaultDraw:False 上使用时应该可以工作。 procedure TForm1.St
我知道如何在 StringGrid.OnDrawCell 事件期间绘制形状(通过调用 TCanvas 对象的方法)。然而,当我这样做时,我的 UI 会随着绘制事件一遍又一遍地触发而不断闪烁并消耗内存。
有没有什么方法可以在不使用 OnDrawCell 事件的情况下在 Delphi 的 TStringGrid 上绘制特定的单元格,例如,如果我单击一个按钮,将根据其内容绘制指定的单元格。 最佳答案 为了
我具有2列1行(TStringGrid的字符串网格(Property: ColCount = 2 & Rowcount = 1)。 OnDrawCell事件的代码: procedure TForm1.
我有以下代码(分配给 DrawGrid1.OnDrawCell 事件): procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow:
我是一名优秀的程序员,十分优秀!