添加TMenuItem位图

时间:2011-07-28 15:46:38

标签: delphi bitmap menuitem

我想为动态创建的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;

3 个答案:

答案 0 :(得分:8)

Bitmap上的TMenuItem属性不是这里的方式。你真的应该使用图像列表。这将允许您以可管理的方式在UI元素之间共享图像。

  1. 将图标添加到TImageList
  2. 在菜单上设置Images属性(即PopupMenu1)以引用图像列表。
  3. 将菜单项的图像索引设置为列表中图标的索引,即如果是第一张图像则为0。
  4. 当然,你真的应该也在使用动作,在这种情况下你只需要为动作设置ImageIndex,框架就会把它分配给菜单项。

    顺便说一句,我会注意到Vista主题菜单的Delphi实现有大量微妙的错误,其中许多与绘制图像有关。但是,这些错误在视觉冲击方面相对较小。

答案 1 :(得分: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;

虽然我同意大卫的观点。最好使用TImageList

答案 2 :(得分:1)

a)一旦有了图像,就无法设置TIcon尺寸 - 如果你加载的图标不是16x16,你会得到一个例外,b)你没有说明你的父菜单是否使用了TImageList(如果是这样,你不能设置单个图像),c)默认情况下,我不认为tmenuitem位图具有特定的大小/颜色深度或其他任何东西。您需要正确创建TBitmap以分配给TMenuItem.Bitmap(假设您的父菜单不使用TImageLists)。