gpt4 book ai didi

delphi - 当 TDBGrid.DefaultDrawing 为 false 时,如何对选定的全行 TDBGrid 进行正确的所有者绘制?

转载 作者:行者123 更新时间:2023-12-03 15:01:30 26 4
gpt4 key购买 nike

当您有一个 TDBGrid,全行选择,并且始终显示选择(即使没有聚焦时),并且您想要完全由所有者绘制它时,您可以选择已弃用的事件 OnDrawDataCell ,和一个新事件 DrawColumnCell,我选择了后者并尝试这样做:

procedure TDbGridTestForm.mygridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then begin
// mygrid.DrawCellHighlight(Rect, State, Col, Row);
mygrid.Canvas.Brush.Color := clHighlight;
mygrid.Canvas.Font.Color := clHighlightText;
mygrid.Canvas.FillRect(Rect);
end;


mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

让我发疯的是焦点指示(突出显示颜色和焦点矩形)不是由 DefaultDrawColumnCell 代码绘制的,我确信我应该调用 DrawCellHighlight 而不是执行我上面正在执行的 FillRect hack 。

如果我打开 DefaultDrawing,我会遇到一组故障(奇怪的字体绘制问题),如果我将其关闭,我会遇到另一组故障(即使在 gdSelected 时也没有突出显示)。

DBGrids.pas DefaultDrawColumnCell 中的代码除了绘制文本之外什么也不做。很明显,如果您自己接管所有绘图代码,您应该做更多的事情。然而,DBGrids.pas 所依赖的内置于 Grids.pas 中的突出显示绘制代码并未设计为从此上下文中调用。我不知道我是否应该直接调用 DrawCellHighlight (如上面注释所示),并计算出 Col 和 Row 值,或者我是否应该编写自己的 TCustomGrid.DrawCellHighlight 的复杂版本手动处理所有各种情况。

当然,这是如此简单、显而易见,而我只是忽略了它。注意,我必须关闭 DefaultDrawing,因此我必须完全从我的所有者绘制事件中进行绘制,并且当主题服务不可用时我必须能够运行,并且当主题服务可用时我必须使用它们。所以我需要直接调用 TCustomGrid.DrawCellHighlight (而且我不知道如何),或者我需要完全重新实现它。

最佳答案

由于您需要自己实现主题支持,因此最好调用 DrawCellHighlight。即使行号没有提供给 OnDrawColumnCell,它看起来也没有被 DefaultDrawColumnCell 代码使用,因此您不必尝试在内部计算它:

type
tHackGrid = class(tDBGrid);

procedure TTDbGridTestForm.myGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then begin
tHackGrid(mygrid).DrawCellHighlight(Rect, State, Column.Index, 0);
end;
mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

关于delphi - 当 TDBGrid.DefaultDrawing 为 false 时,如何对选定的全行 TDBGrid 进行正确的所有者绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9468791/

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