与Delphi 7相比,Delphi 2010在画布透明度方面有所不同?
出于通常的原因,我正在将一些非常旧的代码从Delph7移植到Delphi2010,并对现有的代码库进行一些更改 首先:对于那些还没有跳的人来说,这是个好消息:这并不像看上去那么令人畏惧!事实上,我很高兴(和惊讶)1000000多行代码如此容易地跨越。回到领先地位是多么令人宽慰啊!Delphi2010有很多很棒的增强功能 然而,我对一些TStringGrids和TDbGrids的后代有一个外观上的问题 在上个世纪(字面上!)有人写了以下两种方法 第一种方法用于对齐文本。在Delphi 2010中运行时,写入到的单元格中会出现新文本和到的不合理文本。当然,它在视觉上是一团混乱,几乎难以辨认。有时,由于使用了第二种方法,网格单元实际上是半透明的,下面窗口中的文本显示为透明。(再说一次,不漂亮!) 在我看来,Delphi 2010的TDbGrid和TStringGrid在处理透明度的方式上有一些不同 我在德尔菲这个领域没有太多经验(事实上,我不知道第二种方法到底在做什么!),我希望有人能给我一些关于发生了什么以及如何修复它的建议 蒂亚 方法1 方法2与Delphi 7相比,Delphi 2010在画布透明度方面有所不同?,delphi,Delphi,出于通常的原因,我正在将一些非常旧的代码从Delph7移植到Delphi2010,并对现有的代码库进行一些更改 首先:对于那些还没有跳的人来说,这是个好消息:这并不像看上去那么令人畏惧!事实上,我很高兴(和惊讶)1000000多行代码如此容易地跨越。回到领先地位是多么令人宽慰啊!Delphi2010有很多很棒的增强功能 然而,我对一些TStringGrids和TDbGrids的后代有一个外观上的问题 在上个世纪(字面上!)有人写了以下两种方法 第一种方法用于对齐文本。在Delphi 2010中运
在方法2中,我将尝试使用
SetBkMode(句柄,不透明)代码>
更新:我会把它放在FillRect(B)之前。我把它作为一个答案发布(它不是),这样我就可以包含一张图片了
谢谢你的建议。使用不透明有助于初始写入TDbGrid。背景不再流血了!我有点不好意思,我以前没有发现“透明”这个词
但是,对单元格的更改仍然无法擦除以前的内容,因此它们看起来像下面的屏幕。该死
网格内容向下移动了一行,但网格内容也保留在先前所在的单元格中。我们始终使用DrawText函数,该函数使我们能够控制对齐(垂直和水平)。
在清理内容之前,必须使用FillRect(Rect)
我从未使用过SetBkMode(),但我猜你可以不用它。更新了我的答案:在SetBkMode(句柄,不透明)
之后尝试执行FillRect(B)
。
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;
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;