【问题标题】:Delphi TSpeedButton Glyph TransparencyDelphi TSpeedButton 字形透明度
【发布时间】:2014-04-07 14:01:06
【问题描述】:

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

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

我不知道这些工件是如何到达那里的,但我确信它不是来自 TdsTaskBar-/TdsTaskButton-Component,因为我检查了所有与绘画相关的程序。

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


这里是指定字形的代码sn-p,绘图由标准Vcl SpeedButton Code处理:

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;

【问题讨论】:

  • 对我来说似乎是组件的缺陷,请问designer?
  • 我有组件的完整源代码,而且代码不多,只有一个短单元。字形的绘制简单明了,我敢肯定错误不在于那里。我将编辑问题并添加 Glyph 绘图的代码。
  • 我看不到你在哪里清除了Glyph 的背景。我也不太明白你为什么需要b。最后,看起来您正在使用具有 alpha 透明度的图像。如果是这样,为什么要使用TransparentColor
  • @DavidHeffernan 我也可以在字形的位图中执行相同的“清除”操作,但这不会改变结果...如果应用程序图标不可用,则使用位图t 16x16 像素,所以我可以使用拉伸绘图。这段代码不是我发明的,但我也没有修改它,因为它在我看来是合法的。
  • @SirRufo 这是更好的解决方案,你是对的,但这不会改变透明度方面的任何事情

标签: delphi icons vcl delphi-xe5


【解决方案1】:

您必须擦除字形背景。

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

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;

【讨论】:

  • 对不起,问题没有解决..还是和问题中描述的效果一样
  • 虽然你的实现显然比原来的要好得多:D
  • 我没有安装组件,但是使用普通的 SpeedButton 我可以在字形上绘制图标而不会产生副作用
  • 好的...如果我确实监督有关绘图的某些事情,我必须深入研究例程。
【解决方案2】:

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

因此,DoubleBuffering 似乎影响了按钮透明度的功能。

【讨论】:

  • 这完美地说明了为什么您应该参加 SSCCE!
  • 是的,猜你是对的......下次我会考虑它并制作 SSCCE
  • 有 90% 的时间是您进行 SSCCE 并且这样做会导致您找到问题的根源。这是双赢的!
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多