добавить растровое изображение TMenuItem - PullRequest
3 голосов
/ 28 июля 2011

Я хочу добавить растровое изображение к 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 ]

8 голосов
/ 28 июля 2011

Свойство Bitmap на TMenuItem не является подходящим способом.Вы действительно должны использовать списки изображений вместо этого.Это позволит вам управлять изображениями между вашими элементами пользовательского интерфейса управляемым образом.

  1. Добавьте значок к TImageList.
  2. Установите свойство Images в меню (т. е. PopupMenu1) для ссылки на список изображений.
  3. Установите индекс изображения элемента меню на индекс значка в списке, т. е. 0, если это первое изображение.

Конечно, вам действительно следует использовать действия, и в этом случае вам просто нужно установить ImageIndex для действия, и фреймворк позаботится о назначении его пункту меню.

КакКроме того, я хотел бы отметить, что реализация тематических меню Vista в Delphi имеет большое количество тонких ошибок, многие из которых связаны с рисованием изображений.Тем не менее, эти ошибки являются относительно незначительными в визуальном воздействии.

2 голосов
/ 28 июля 2011

Добавить строку

   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.

1 голос
/ 28 июля 2011

а) Вы не можете установить размеры TIcon, если в них есть изображение - если загруженный значок уже не 16x16, вы получите исключение, б) Вы не указываете, использует ли ваше родительское меню TImageList (если так, вы не можете установить отдельные изображения), в) по умолчанию, я не думаю, что растровые изображения tmenuitem имеют определенный размер / глубину цвета или что-то еще. Вам необходимо правильно создать TBitmap, чтобы назначить его TMenuItem.Bitmap (при условии, что ваше родительское меню не использует TImageLists).

...