我想为动态创建的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;
答案 0 :(得分:8)
Bitmap
上的TMenuItem
属性不是这里的方式。你真的应该使用图像列表。这将允许您以可管理的方式在UI元素之间共享图像。
TImageList
。Images
属性(即PopupMenu1
)以引用图像列表。当然,你真的应该也在使用动作,在这种情况下你只需要为动作设置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)。