Avec l'inspiration de this post j'ai créé un TStringGrid
avec une image en arrière-plan. Ensuite, j'ai ajouté une couleur tranparent en utilisant WinApi.Windows.AlphaBlend()
pour les cellules sélectionnées et de manière similaire pour les cellules fixées. Le résultat final est la suivante:
Le transparent "sélectionné" couleur est effectuée en tant que bitmap 1 pixel:
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;
Et le bitmap est appliqué pour les cellules "sélectionnées" (gdSelected in State
) dans l'événement OnDrawCell
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;
la structure BlendFunc: _BLENDFUNCTION;
peut être déclarée dans le TStringGrid
sous-classe ou ailleurs où il est accessible, je déclare sous la forme et initialisés dans les formes OnCreate
événement:
BlendFunc.BlendOp := AC_SRC_OVER;
BlendFunc.BlendFlags := 0;
BlendFunc.SourceConstantAlpha := 128; // This determines opacity
BlendFunc.AlphaFormat := AC_SRC_ALPHA;
Maintenant, vous pouvez demander, comment se fait une des œuvres bitmap 1 pixel, et la réponse est dans le documentation pour AlphaBlend()
:
Si le rectangle source et le rectangle de destination ne sont pas la même taille , l'image source est étirée pour correspondre au rectangle destination .
Ceci est utile car les rectangles de cellules varient généralement en taille.
La ligne d'en-tête et la colonne sont dessinées similairement dans le OnDrawCell
à la condition if gdFixed in State
et ici un autre bitmap est utilisé. C'est un bitmap de 1 pixel de large et de 23 pixels de haut que j'ai fait séparément dans un programme de dessin graphique.
Oui! La petite chose ci-dessus est l'image.
Je ne comprends pas ce que vous avez et ce que vous voulez faire .... –
Je voudrais colorier la cellule était transparente - alpha, peu importe;) – Mlody87
Vous voulez dire que vous voulez voir partiellement l'arrière-plan de la formulaire/panneau ou whatover dans lequel la grille est insérée? –