首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringGrid中的透明颜色

StringGrid中的透明颜色
EN

Stack Overflow用户
提问于 2016-10-12 13:10:08
回答 1查看 2.4K关注 0票数 1

我用StringGrid绿色填充单元格

代码语言:javascript
复制
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;

我的StringGrid是黑色的。我想填充单元格透明的颜色(例如50%)。

我该怎么做?

我应该画长方形吗?或者我应该创建位图然后放进牢房?

你能帮我吗?)

我指的是这样的效果:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-14 21:21:11

这个职位的启发下,我首先创建了一个具有背景图像的TStringGrid。然后,我为所选的单元格添加了一个使用WinApi.Windows.AlphaBlend()的转换颜色,对于固定的单元格也添加了类似的颜色。最终的结果是:

透明的“选定”颜色以1像素位图的形式完成:

代码语言:javascript
复制
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事件中的“选定”单元格(OnDrawCell)。

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
  BlendFunc.BlendOp := AC_SRC_OVER;
  BlendFunc.BlendFlags := 0;
  BlendFunc.SourceConstantAlpha := 128;  // This determines opacity
  BlendFunc.AlphaFormat := AC_SRC_ALPHA;

现在,您可能会问,一个1像素的位图是如何工作的,答案在文档 for AlphaBlend()中。

如果源矩形和目标矩形大小不同,则扩展源位图以匹配目标矩形。

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

标题行和列类似地在条件OnDrawCell if gdFixed in State中绘制,这里使用另一个位图。这是一个1像素宽和23像素高的位图,我分别在一个图形绘图程序。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39999466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档