2016-10-12 3 views
0

I remplir les cellules de couleur verte StringGridcouleur transparente StringGrid

procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
begin 

StringGrid.Canvas.Brush.Color := clGreen; 
StringGrid.Canvas.FillRect(Rect); 

StringGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, AGrid.Cells[ACol, ARow]); 

end; 

Mon StringGrid est de couleur noire. Je voudrais remplir la couleur de cellule transparente (par exemple 50%).

Comment est-ce que je peux faire ceci?

Je devrais dessiner un rectangle? Ou je devrais créer bitmap et mettre dans la cellule?

Pouvez-vous me aider :)

effet Imean comme ceci: enter image description here

+0

Je ne comprends pas ce que vous avez et ce que vous voulez faire .... –

+0

Je voudrais colorier la cellule était transparente - alpha, peu importe;) – Mlody87

+0

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? –

Répondre

5

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:

enter image description here

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.

enter image description here

Oui! La petite chose ci-dessus est l'image.