Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与Delphi 7相比,Delphi 2010在画布透明度方面有所不同?_Delphi - Fatal编程技术网

与Delphi 7相比,Delphi 2010在画布透明度方面有所不同?

与Delphi 7相比,Delphi 2010在画布透明度方面有所不同?,delphi,Delphi,出于通常的原因,我正在将一些非常旧的代码从Delph7移植到Delphi2010,并对现有的代码库进行一些更改 首先:对于那些还没有跳的人来说,这是个好消息:这并不像看上去那么令人畏惧!事实上,我很高兴(和惊讶)1000000多行代码如此容易地跨越。回到领先地位是多么令人宽慰啊!Delphi2010有很多很棒的增强功能 然而,我对一些TStringGrids和TDbGrids的后代有一个外观上的问题 在上个世纪(字面上!)有人写了以下两种方法 第一种方法用于对齐文本。在Delphi 2010中运

出于通常的原因,我正在将一些非常旧的代码从Delph7移植到Delphi2010,并对现有的代码库进行一些更改

首先:对于那些还没有跳的人来说,这是个好消息:这并不像看上去那么令人畏惧!事实上,我很高兴(和惊讶)1000000多行代码如此容易地跨越。回到领先地位是多么令人宽慰啊!Delphi2010有很多很棒的增强功能

然而,我对一些TStringGrids和TDbGrids的后代有一个外观上的问题

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

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

在我看来,Delphi 2010的TDbGrid和TStringGrid在处理透明度的方式上有一些不同

我在德尔菲这个领域没有太多经验(事实上,我不知道第二种方法到底在做什么!),我希望有人能给我一些关于发生了什么以及如何修复它的建议

蒂亚

方法1 方法2
在方法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;