我目前正在使用一个名为TdsTaskBar的组件,它打算像Windows中的TaskBar一样工作,这意味着所有打开的窗口(但现在在我的应用程序中)都被列为应用程序窗口底部的按钮。这个按钮是TSpeedButtons。 现在我已经改变了自己窗户的图标,这些图标总是通过SpeedButtons的字形显示出来。问题是,透明度不起作用。
我知道左下角像素定义的透明度颜色,但这不是我的问题。问题是,字形的透明区域显示"随机"更改活动窗口然后将鼠标悬停在按钮上时,图像工件而不是按钮背景。这会将背景更改为现在活动窗口的图标,但会有一些失真。
我不知道这些工件是如何实现的,但我确信它不是来自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;
答案 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上透明度的功能。