Does Delphi 2010 have Canvas transparency compared to Delphi 7?

I am transferring very old code from Delph7 to Delphi2010 with some changes, as far as possible, to the existing code base for the usual reasons.

Firstly: good news for those who have not jumped yet: it is not as difficult as it might seem! I am really pleased (and surprised) at how easily 1,000,000 lines of code moved. And what a relief to return to the cutting edge! There are so many great improvements in Delphi 2010.

However, I have a cosmetic issue with some descendants of TStringGrids and TDbGrids.

In the last century (literally!), Someone wrote two methods below.

The first method is used to align text. When you run in Delphi 2010 new text and unjustified text and displayed in the cells, which are recorded. Of course, this mess is visually, almost illegible. Sometimes, as a result of using the second method, the grid cells are actually translucent, and the text from the window below is displayed. (Again, not really!)

It seems to me that Delphi 2010 TDbGrid and TStringGrid have some differences in how they handle transparency?

I do not have much experience in this area of ​​Delphi (in fact, I have no idea what the second method does!) And was hoping that someone could give me some indications of what was happening and how to fix it.

TIA!

Method 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;

Method 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;
+3
source share
3

2 SetBkMode(Handle, OPAQUE);

: FillRect (B)

+1

( ), .

. OPAQUE TDbGrid. ! , "".

- , . !

, , .

0

DrawText, (vert hor). FillRect (Rect).

SetBkMode(), , .

0

Source: https://habr.com/ru/post/1749310/


All Articles