添加TMenuItem位图

4
我想在动态创建的TMenuItem中添加位图。使用这段代码时,它无法正常工作,我的菜单上没有图片。有什么问题吗?
procedure TForm3.FormCreate(Sender: TObject);
var
   item : TmenuItem;
   icon : TIcon;
begin
   item := TMenuItem.Create(PopupMenu1);
   item.Caption := 'coucou';
   icon := TIcon.Create;
   icon.LoadFromFile('d:\SmallIcon.ico');
   icon.Height := 16;
   icon.Width := 16;
   item.Bitmap.Canvas.Draw(0,0,icon);
   PopupMenu1.Items.Add(item);
end;

2
使用小的 {} 工具栏按钮来标记代码片段。这比手动插入 HTML 标签更容易,也能产生更好的结果。 - Uli Gerhardt
3个回答

10
TMenuItemBitmap属性并不适用于这里。您应该使用图像列表,以便可以在 UI 元素之间以可管理的方式共享图像。
  1. 将图标添加到TImageList中。
  2. 将菜单的Images属性(例如 PopupMenu1)设置为引用图像列表。
  3. 将菜单项的图像索引设置为列表中图标的索引,例如如果是第一个图像,则设置为 0。
当然,您确实应该使用操作,这样您只需要设置操作的ImageIndex,框架会处理将其分配给菜单项。
另外,值得注意的是,Vista 主题菜单的 Delphi 实现存在许多微妙的错误,其中许多与图像绘制有关。但是,这些错误在视觉上的影响相对较小。

2
添加这一行
   item.Bitmap.SetSize(16,16);

作为第三个。然后它就可以工作了。

因此,您的代码将如下所示:

var
   item : TmenuItem;
   icon : TIcon;
begin
   item := TMenuItem.Create(PopupMenu1);
   item.Caption := 'coucou';
   item.Bitmap.SetSize(16,16);   // <--- set size of bitmap
   icon := TIcon.Create;
   icon.LoadFromFile('d:\SmallIcon.ico');
   icon.Height := 16;
   icon.Width := 16;
   item.Bitmap.Canvas.Draw(0,0,icon);
   PopupMenu1.Items.Add(item);
end;

尽管我同意David的观点,最好使用 TImageList

2
当调用Assign()时,TIcon知道如何将自己复制到TBitmap中。我建议不要手动调用SetSize()Draw(),而是使用item.Bitmap.Assign(icon); - Remy Lebeau
2
那是我的第一个想法,但在Delphi 2009中它不起作用(EConvertError)。不过XE可以工作(TIcon.AssignTo似乎是新的)。 - Heinrich Ulbricht
在D2010中运行良好,因此这一定是一个新功能。 - Remy Lebeau

1

a) 如果TIcon中已经有图像,您就无法设置其尺寸--如果您加载的图标不是16x16,则会出现异常,b) 您没有指示父菜单是否使用TImageList(如果是这样,您无法设置单个图像),c) 默认情况下,我认为tmenuitem位图没有特定的大小/颜色深度或其他任何东西。您需要正确创建一个TBitmap并分配给TMenuItem.Bitmap(假设您的父菜单不使用TImageLists)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接