Delphi XE2中的FillRect无法完全绘制TStringGrid单元格

15

FillRect 在 Delphi XE2 中无法完全绘制 TStringGrid 单元格。在默认颜色下(BiDiMode 设置为 bdLeftToRight),左侧存在 3 个像素的间隙。而我之前使用的 Delphi 6 中不存在这个问题。

procedure TShapeline.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  Stringgrid1.Canvas.Brush.Color:=$00FF80FF;
  StringGrid1.Canvas.FillRect(Rect);
end;

我尝试更改所有属性(包括DrawingStyle)和不同的画笔样式,但绘制的矩形没有填满整个单元格。

4个回答

18

当启用主题且DefaultDrawing = true时,这是XE2中的预期行为(我不会在这里讨论好坏 - 正如您可能已经注意到的,对于从右到左的模式,行为是不同的...)。

解决方法是检查此条件并在调用FillRect之前将Rect.Left减少4个像素。


1
有没有办法找出要减少多少像素?我真的不喜欢为这些情况硬编码值。随着许多代码从XP到Vista和新的边框厚度的转变而破裂,它会崩溃。 - Marjan Venema
2
@Marjan - 这是VCL源代码中硬编码的“4”(TStringGrid.DrawCell)。它不是样式的属性,也不是常量,只是“4”。 - Sertac Akyuz
谢谢 - 将 Rec.Left 减少 4 像素可以解决我的问题! - Finike
1
在我们遇到这个问题并且已经硬编码修复方案但是在Win2008服务器或XP上无法工作,但在Win 7上可以工作之后,偶然发现了这个。添加一个检查默认绘图和样式服务是否启用的条件允许我们在必要时适当地将4像素向左移动。如果TStringGrid(Sender).DefaultDrawing and (StyleServices.Enabled) then... - TJ Asher
我宁愿自己画网格,也不想依赖这个Windows绘图疯狂!这正是我在所有的网格中所做的,即使我使用VCL样式。我应该将这种绘图封装在自己的网格控件中... - Jerry Dodge
谢谢,救了我的“命”:D - Andreas Hinderberger

4
您可以使用StringGrid1.CellRect(ACol, ARow) 来获取单元格的实际 TRect,而无需使用参数 Rect

1
哎呀,OnDrawCell事件处理程序中有一个很重的例程! - NGLN

0

既然你要自己绘制网格单元格,那么就把默认绘制属性Grid的值关闭,设置为false。


1
所示代码不绘制网格单元格;它绘制网格单元格的内容。如果关闭DefaultDrawing,则还必须输出文本和网格线,这需要更多的代码。最好只需通过调整rect几个像素来调整主题绘图添加的填充即可,如Uwe的答案中所述。 - Ken White

0

关闭TStringGrid的前4个选项:

  • goFixedVertLine
  • goFixedHorizLine
  • goVertLine
  • goHorizLine

这样它就不会绘制网格线,您的网格单元格将直接绘制到边缘。我刚在XE上尝试了一下。


2
如果运算操作(OP)需要网格线怎么办? - Marjan Venema
那么我的回答可能不会有帮助,但是关闭固定行似乎有所帮助。 - Bruce McGee
@Bruce,你的修复对于XE是正确的,但不适用于XE2。在TStringGrid.DrawCell中实际上有一些代码,如果DefaultDrawing为true并且启用了StyleServices,则会执行ARect.Left:= ARect.Left + 4。 - Mike W
@Mike,我测试了XE,因为原始问题是这样标记的(没有仔细阅读描述)。我没有想到在XE2中会有所不同。哎呀,确实是个问题。 - Bruce McGee
@Bruce,没错。这似乎会破坏很多现有的所有者绘制代码。我添加了Delphi-XE2标签以供将来参考。 - Mike W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接