gpt4 book ai didi

与 Delphi 7 相比,Delphi 2010 的 Canvas 透明度有何不同?

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

由于通常的原因,我将一些非常旧的代码从 Delph7 移植到 Delphi2010 并对现有代码库进行了一些尽可能的更改

首先:对于尚未跳伞的人来说,好消息是:它并不像看上去那么令人畏惧!事实上,我很高兴(也很惊讶)超过 1,000,000 行代码的迁移是多么容易。重新回到领先地位是多么令人欣慰啊! Delphi 2010 有许多出色的增强功能。

但是,我遇到了一些 TStringGrids 和 TDbGrids 后代的外观问题。

在上个世纪(字面上!)有人编写了以下两种方法。

第一种方法用于对齐文本。在 Delphi 2010 中运行时,新文本不合理的文本两者出现在写入的单元格中。当然,视觉上很困惑,几乎难以辨认。有时,由于使用第二种方法,网格单元实际上是半透明的,下面窗口中的文本显示出来。 (再说一次,不漂亮!)

在我看来,Delphi 2010 的 TDbGrid 和 TStringGrid 在处理透明度方面有一些差异?

我在 Delphi 的这个领域没有太多经验(事实上,我不知道第二种方法实际上在做什么!)并且希望有人能给我一些关于正在发生的事情以及如何解决它的指示。

TIA!

方法1

  procedure TForm1.gridDrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
{Used to align text in cells.}
var
x: integer;
begin
if (Row > 0) AND (Col > 0) then
begin
SetTextAlign(grdTotals.Canvas.Handle, TA_RIGHT);
x := Rect.Right - 2;
end
else
begin
SetTextAlign(grdTotals.Canvas.Handle, TA_CENTER);
x := (Rect.Left + Rect.Right) div 2;
end;
grdTotals.Canvas.TextRect(Rect, x, Rect.Top+2, grdTotals.Cells[Col,Row]);
end;

方法2

procedure WriteText(ACanvas: TCanvas; ARect: TRect; DX, DY: Integer; const Text: string;
TitleBreak: TTitleBreak; Alignment: TAlignment);
const
AlignFlags: array [TAlignment] of Integer = (DT_LEFT or
{ DT_WORDBREAK or } DT_EXPANDTABS or DT_NOPREFIX, DT_RIGHT or
{ DT_WORDBREAK or } DT_EXPANDTABS or DT_NOPREFIX, DT_CENTER or
{ DT_WORDBREAK or } DT_EXPANDTABS or DT_NOPREFIX);
var
ABitmap: TBitmap;
AdjustBy: Integer;
B, R: TRect;
WordBreak: Integer;
begin
WordBreak := 0;
if (TitleBreak = tbAlways) or ((TitleBreak = tbDetect) and (Pos(Chr(13) + Chr(10), Text) = 0))
then
WordBreak := DT_WORDBREAK;
ABitmap := TBitmap.Create;
try
ABitmap.Canvas.Lock;
try
AdjustBy := 1;
if (Alignment = taRightJustify) then
Inc(AdjustBy);
with ABitmap, ARect do
begin
Width := Max(Width, Right - Left);
Height := Max(Height, Bottom - Top);
R := Rect(DX, DY, Right - Left - AdjustBy, Bottom - Top - 1); { @@@ }
B := Rect(0, 0, Right - Left, Bottom - Top);
end;
with ABitmap.Canvas do
begin
Font := ACanvas.Font;
Brush := ACanvas.Brush;
Brush.Style := bsSolid;
FillRect(B);
SetBkMode(Handle, TRANSPARENT);
DrawText(Handle, PChar(Text), Length(Text), R, AlignFlags[Alignment] or WordBreak);
end;
ACanvas.CopyRect(ARect, ABitmap.Canvas, B);
finally
ABitmap.Canvas.Unlock;
end;
finally
ABitmap.Free;
end;
end;

最佳答案

在方法 2 中,我会尝试使用 SetBkMode(Handle, OPAQUE);

更新:我会把它放在 FillRect(B) 之前

关于与 Delphi 7 相比,Delphi 2010 的 Canvas 透明度有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3010824/

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