Delphi StringGrid中的透明颜色

Delphi StringGrid中的透明颜色,delphi,pascal,lazarus,freepascal,stringgrid,Delphi,Pascal,Lazarus,Freepascal,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,

我用绿色网格填充单元格

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;
我的网格是黑色的。我想填充单元格透明颜色,例如50%

我该怎么做

我应该画长方形吗?或者我应该创建位图并放入单元格

你能帮我吗

我会产生这样的效果:

灵感来源于我首先创作了一个背景为图像的TStringGrid。然后,我使用WinApi.Windows.AlphaBlend为所选单元格添加了一个tranparent颜色,并为固定单元格添加了类似的颜色。最终结果是:

透明选定颜色作为1像素位图完成:

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;
位图将应用于OnDrawCell事件中处于选中状态的选定单元格

BlendFunc:\u BLENDFUNCTION;结构可以在TStringGrid子类中声明,也可以在其他可以访问的地方声明,我在表单中声明了它,并在表单OnCreate事件中初始化了它:

现在,您可能会问,1像素位图是如何工作的,答案是AlphaBlend的:

如果源矩形和目标矩形不相同 大小时,将拉伸源位图以匹配目标 矩形

这很有用,因为单元格矩形的大小通常不同

标题行和列在OnDrawCell中以类似方式绘制,条件是gdFixed处于状态,此处使用另一个位图。这是一个1像素宽和23像素高的位图,我分别在图形绘图程序中制作

对!!上面的小东西是图像。

灵感来源于我首先创建了一个背景为图像的TStringGrid。然后,我使用WinApi.Windows.AlphaBlend为所选单元格添加了一个tranparent颜色,并为固定单元格添加了类似的颜色。最终结果是:

透明选定颜色作为1像素位图完成:

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;
位图将应用于OnDrawCell事件中处于选中状态的选定单元格

BlendFunc:\u BLENDFUNCTION;结构可以在TStringGrid子类中声明,也可以在其他可以访问的地方声明,我在表单中声明了它,并在表单OnCreate事件中初始化了它:

现在,您可能会问,1像素位图是如何工作的,答案是AlphaBlend的:

如果源矩形和目标矩形不相同 大小时,将拉伸源位图以匹配目标 矩形

这很有用,因为单元格矩形的大小通常不同

标题行和列在OnDrawCell中以类似方式绘制,条件是gdFixed处于状态,此处使用另一个位图。这是一个1像素宽和23像素高的位图,我分别在图形绘图程序中制作


对!!上面的小东西是图像。

我不明白你有什么,你想做什么……我想把细胞涂成透明的颜色——阿尔法,随便什么;您的意思是希望部分查看窗体/面板的背景或网格插入到的任何位置?最终,当StringGrid.Color:=任意值时,会查看StringGrid的背景;我有彩色的细胞,看看。使用AR和NGLN答案的组合。我不明白你有什么,你想做什么…我想把细胞涂成透明的颜色-阿尔法,随便什么;您的意思是,您希望部分查看表格/面板的背景或将网格插入到哪个位置?无论何时,StringGrid的背景都是StringGrid.Color:=任意内容;我有彩色的细胞,看看。使用AR和NGLN答案的组合。
  BlendFunc.BlendOp := AC_SRC_OVER;
  BlendFunc.BlendFlags := 0;
  BlendFunc.SourceConstantAlpha := 128;  // This determines opacity
  BlendFunc.AlphaFormat := AC_SRC_ALPHA;