Inspiriert von this post ich ein TStringGrid
mit einem Bild im Hintergrund zum ersten Mal erstellt. Dann fügte ich eine transparente Farbe unter Verwendung von WinApi.Windows.AlphaBlend()
für die ausgewählten Zellen und ähnlich für die fixierten Zellen hinzu. Das Endergebnis ist das:
Die transparente "ausgewählte" Farbe als einen 1-Pixel-Bitmap durchgeführt wird:
type
TStringGrid = class(Vcl.Grids.TStringGrid)
private
FBackG: TBitmap;
FForeG: TBitmap;
...
procedure TForm5.Button1Click(Sender: TObject);
begin
sg.FForeG.Free;
sg.FForeG := TBitmap.Create;
sg.FForeG.SetSize(1, 1);
sg.FForeG.PixelFormat := pf32bit;
sg.FForeG.Canvas.Pixels[0, 0] := $00FF00; // BGR
end;
Und die Bitmap wird für "ausgewählt" Zellen angewandt (gdSelected in State
) in die OnDrawCell
Ereignis
procedure TForm5.sgDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
var
sg: TStringGrid;
r: TRect;
success:boolean;
begin
if not (Sender is TStringGrid) then Exit;
sg := Sender as TStringGrid;
r := Rect;
r.Left := r.Left-4; // Might not be needed, depending on Delphi version?
// Clear the cell
sg.Canvas.Brush.Color := clBlack;
sg.Canvas.FillRect(r);
// Copy background to cell
BitBlt(sg.Canvas.Handle,
r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top,
sg.FBackG.Canvas.Handle, r.Left, r.Top, SRCCOPY);
// Draw fixed column or row cell(s)
if gdFixed in State then
begin
success := Winapi.Windows.AlphaBlend(sg.Canvas.Handle,
r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top,
sg.FHeadG.Canvas.Handle, 0, 0, 1, 23, BlendFunc);
end;
// Draw selected cell(s)
if gdSelected in State then
begin
success := Winapi.Windows.AlphaBlend(sg.Canvas.Handle,
r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top,
sg.FForeG.Canvas.Handle, 0, 0, 1, 1, BlendFunc);
end;
// Draw the text
r := Rect;
sg.Canvas.Brush.Style := bsClear;
DrawText(sg.Canvas.Handle, sg.Cells[ACol, ARow],
length(sg.Cells[ACol, ARow]), r,
DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS);
end;
die BlendFunc: _BLENDFUNCTION;
Struktur kann in derdeklariert werden 643.210 Unterklasse oder anderswo, wo sie zugänglich ist, erklärte ich es in der Form und initialisiert es in den Formen OnCreate
Veranstaltung:
BlendFunc.BlendOp := AC_SRC_OVER;
BlendFunc.BlendFlags := 0;
BlendFunc.SourceConstantAlpha := 128; // This determines opacity
BlendFunc.AlphaFormat := AC_SRC_ALPHA;
Nun könnten Sie fragen, wie kommt ein 1-Pixel-Bitmap-Werke, und die Antwort ist im documentation für AlphaBlend()
:
Wenn das Quellrechteck und Zielrechteck nicht die gleiche sind Größe ist das Quellbitmap gestreckt, um das Ziel Rechteck übereinstimmen.
Dies ist nützlich, da die Zellenrechtecke normalerweise in der Größe variieren.
Die Kopfzeile und die Spalte sind ähnlich in der OnDrawCell
unter Bedingung if gdFixed in State
gezeichnet und hier wird eine andere Bitmap verwendet. Es ist eine 1 Pixel breite und 23 Pixel hohe Bitmap, die ich separat in einem Grafik-Zeichenprogramm gemacht habe.
Ja! Das kleine Ding oben ist das Bild.
Ich verstehe nicht, was Sie haben und was Sie tun möchten .... –
Ich würde gerne die Zelle war transparent - alpha, was auch immer;) – Mlody87
Sie meinen, dass Sie teilweise den Hintergrund der sehen wollen Form/Panel oder was ist das Raster? –