【发布时间】: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