2016-10-12 2 views
0

Ich fülle Zellen in String grüne FarbeTransparent Farbe in String

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; 

Mein String schwarze Farbe hat. Ich möchte zelltransparente Farbe (zum Beispiel 50%) füllen.

Wie kann ich das tun?

Ich sollte Rechteck zeichnen? Oder ich sollte eine Bitmap erstellen und in die Zelle einfügen?

Können Sie mir helfen :)

Imean Wirkung wie folgt aus:? enter image description here

+0

Ich verstehe nicht, was Sie haben und was Sie tun möchten .... –

+0

Ich würde gerne die Zelle war transparent - alpha, was auch immer;) – Mlody87

+0

Sie meinen, dass Sie teilweise den Hintergrund der sehen wollen Form/Panel oder was ist das Raster? –

Antwort

5

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:

enter image description here

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.

enter image description here

Ja! Das kleine Ding oben ist das Bild.