我需要在TMenuItem上绘制一个透明的位图。尽管我用不同的方法尝试了许多小时,但我还是没有成功:
var
NewItem: TMenuItem;
ThisBmp: TBitmap;
begin
NewItem := TMenuItem.Create(pmSendToCustomTool);
NewItem.Caption := ThisCaption;
NewItem.Bitmap.SetSize(16,16);
NewItem.Bitmap.PixelFormat := pf32bit;
NewItem.Bitmap.Transparent := True;
NewItem.Bitmap.TransparentColor := clFuchsia;
ThisBmp := TBitmap.Create;
try
ThisBmp.SetSize(16,16);
ThisBmp.PixelFormat := pf32bit;
ThisBmp.Transparent := True;
ThisBmp.Canvas.Brush.Color := clFuchsia;
ThisBmp.TransparentColor := clFuchsia;
MySystemImageList1.GetBitmap(AIndex, ThisBmp);
CodeSite.Send('ThisBmp', ThisBmp);
NewItem.Bitmap.Assign(ThisBmp);
CodeSite.Send('NewItem.Bitmap', NewItem.Bitmap);
finally
ThisBmp.Free;
end;这就是ThisBmp在CodeSite中在GetBitmap之后的看法:

结果菜单项的外观如下:

发布于 2019-01-15 18:59:51
您的代码无法工作,因为您在使用GetBitmap()时丢失了所有透明信息。您必须手动绘制位图,例如:
uses
..., Winapi.CommCtrl;
procedure GetTransparentBitmapFromImageList(ImageList: TCustomImageList; Index: Integer; Bitmap: TBitmap);
var
i: integer;
begin
// make sure your ImageList is set to ColorDepth=cd32bit and DrawingStyle=dsTransparant beforehand...
Bitmap.SetSize(ImageList.Width, ImageList.Height);
Bitmap.PixelFormat := pf32bit;
if (ImageList.ColorDepth = cd32Bit) then
begin
Bitmap.Transparent := False;
Bitmap.AlphaFormat := afDefined;
end
else
Bitmap.Transparent := True;
for i := 0 to Bitmap.Height-1 do
FillChar(Bitmap.ScanLine[i]^, Bitmap.Width*SizeOf(DWORD), $00);
ImageList_Draw(ImageList.Handle, Index, Bitmap.Canvas.Handle, 0, 0, ILD_TRANSPARENT);
end;另一种选择是:
procedure GetTransparentBitmapFromImageList(ImageList: TCustomImageList; Index: Integer; Bitmap: TBitmap);
begin
Bitmap.PixelFormat := pf32bit;
Bitmap.Canvas.Brush.Color := clFuschia;
Bitmap.SetSize(ImageList.Width, ImageList.Height);
ImageList.Draw(Bitmap.Canvas, 0, 0, AIndex, dsTransparent, itImage);
Bitmap.Transparent := True;
Bitmap.TransParentColor := clFuchsia;
Bitmap.TransparentMode := tmAuto;
end;然后你就可以这样做:
var
NewItem: TMenuItem;
begin
NewItem := TMenuItem.Create(pmSendToCustomTool);
NewItem.Caption := ThisCaption;
GetTransparentBitmapFromImageList(MySystemImageList1, AIndex, NewItem.Bitmap);
CodeSite.Send('NewItem.Bitmap', NewItem.Bitmap);
end;https://stackoverflow.com/questions/54204937
复制相似问题