【发布时间】:2019-01-15 18:34:35
【问题描述】:
我需要在 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;
【问题讨论】:
-
您是否有理由不简单地使用
TMenuItem.ImageIndex属性?将您的 ImageList 分配给父菜单的Images属性或父菜单项的SubMenuImages属性(取决于您的 UI 设计),然后将菜单项的ImageIndex设置为所需的索引。让 ImageList 为您处理透明绘图。 -
是的,这是有原因的。我必须这样做。原因:在弹出菜单中,我有一些从 SystemImageList(如上)获取字形的项目和从标准 TImageList 获取字形的其他项目。由于我只能对整个弹出菜单使用 ONE Imagelist,因此我必须以这种方式提取部分字形。
-
实际上,你没有。您可以 1) 将所有图像复制到单个 TImageList,或 2) 所有者绘制菜单项,然后您可以从任何您想要的源进行绘制。您根本不必使用
Bitmap属性。 -
为什么要手动设置透明色?如果您将
TBitmap.Transparent设置为True并且不为TransparentColor设置任何值,则TBitmap 将使用左下图像像素作为透明颜色。还有你为什么要设置Brush.color?
标签: delphi delphi-10.1-berlin tmenuitem