Delphi TSpeedButton字形透明度

时间:2014-04-07 14:01:07

标签: delphi icons vcl delphi-xe5

我目前正在使用一个名为TdsTaskBar的组件,它打算像Windows中的TaskBar一样工作,这意味着所有打开的窗口(但现在在我的应用程序中)都被列为应用程序窗口底部的按钮。这个按钮是TSpeedButtons。 现在我已经改变了自己窗户的图标,这些图标总是通过SpeedButtons的字形显示出来。问题是,透明度不起作用。

我知道左下角像素定义的透明度颜色,但这不是我的问题。问题是,字形的透明区域显示"随机"更改活动窗口然后将鼠标悬停在按钮上时,图像工件而不是按钮背景。这会将背景更改为现在活动窗口的图标,但会有一些失真。

First window opened Second window opened, hovered over the button

我不知道这些工件是如何实现的,但我确信它不是来自TdsTaskBar- / TdsTaskButton-Component,因为我检查了所有与油漆相关的程序。

有人知道如何解决这个问题吗?我已经考虑过自己绘制背景了,但是因此我需要知道这个雕文背后的实际按钮颜色,这是我不确定如何计算的另一件事出来。


这里是用于分配字形的代码片段,该绘图由标准Vcl SpeedButton代码处理:

procedure TTaskBarButton.AssignGlyphIcon;
var
  GlyphIcon: TIcon;
  b: TBitmap;
begin
  if TForm(owner).Icon.Empty then
    GlyphIcon := Application.Icon
  else
    GlyphIcon := TForm(owner).Icon;

  b := TBitmap.create;
  try
    b.Width := GlyphIcon.Width;
    b.Height := GlyphIcon.Height;
    b.Canvas.Brush.Color := b.TransparentColor;    // This two lines were added by me
    b.Canvas.FillRect(b.ClipRect);         // so that the background of my "helper" bitmap is transparent, too
    b.Canvas.Draw(0,0, GlyphIcon);
    Glyph.Width := 16;
    Glyph.Height := 16;
    Glyph.Canvas.StretchDraw(Rect(0, 0, 16, 16), b);
  finally
    b.free;
  end;
end;

2 个答案:

答案 0 :(得分:2)

你必须删除字形背景。

这是一个示例代码,应该完成这项工作

procedure TTaskBarButton.AssignGlyphIcon;
var
  b: TBitmap;
  r: TRect;
begin
  b := TBitmap.create;
  try
    if TForm( Owner ).Icon.Empty then
      b.Assign( Application.Icon )
    else
      b.Assign( TForm(Owner).Icon );

    r := TRect.Create( 0, 0, 16, 16 );
    Glyph.Width := r.Width;
    Glyph.Height := r.Height;
    // clear the background
    Glyph.Canvas.Brush.Color := Glyph.TransparentColor;
    Glyph.Canvas.FillRect( r );
    // draw the icon
    Glyph.Canvas.StretchDraw( r, b );
  finally
    b.free;
  end;
end;

答案 1 :(得分:0)

找到解决方案:TdsTaskBar(它是一个TCustomPanel)将DoubleBuffered默认设置为false。按钮继承此设置。将此更改为true可解决问题。

所以看起来DoubleBuffering会影响Buttons上透明度的功能。