Как записать динамический текст в изображение в TImageList, используемом навигационной панелью? - PullRequest
0 голосов
/ 04 июля 2019

Недавно я столкнулся с ситуацией, когда мне нужно было записать счетчик для изображения, используемого для панели навигации, где изображение было получено из компонента списка изображений.

После нескольких часов работы над мозгом, просматривая другие статьи, такие как:

Как загрузить прозрачное изображение из ImageList?

*. Bmp теряет прозрачный фон при использовании v6 ImageList Control

http://codeverge.com/embarcadero.delphi.graphics/timage-is-not-transparent-after-a/1080826

http://www.efg2.com/Lab/Library/Delphi/Graphics/ICOtoBMP.pas.txt

Я остановился на решении, которое скопировало растровое изображение из списка изображений, записало текст на холст растрового изображения, а затем поместило растровое изображение обратно в список изображений.

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

Я мог бы извлечь и переназначить изображение ОК, включая прозрачность, если бы я использовал GetIcon вместо GetBitmap, но тогда у меня не было Canvas для использования TextOut.

Если я установлю цвет так, чтобы изображение выглядело правильно в компонентах, которые связаны с списком изображений, например, моя панель навигации, при извлечении изображения с помощью GetBitmap прозрачность теряется, и она выглядит белой, когда применяется непосредственно к TImage .

OK. Нет проблем. Просто используйте белый в качестве цвета прозрачности ...

Неа. Несмотря на то, что Canvas.Pixels[0, 31] отображал 16777215 в качестве цвета, что соответствует значению clWhite , использование его для TransparentColour не имело никакого эффекта.

Чтобы понять, что я имею в виду, создайте новое приложение VCL Forms в Delphi, добавьте пару TButtons и TImageList и свяжите вторую кнопку со списком изображений с помощью настройка кнопок Изображения в конструкторе. Дважды щелкните первую кнопку и установите код события следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap : TBitMap;
begin
  Bitmap := TBitmap.Create;
  try
    ImageList1.GetBitmap(0, BitMap);
    BitMap.Canvas.Brush.Style := bsClear;
    BitMap.Canvas.Font.Size := 10;
    BitMap.Canvas.Font.Color := clBlack;
    BitMap.Canvas.Font.Style := [fsBold];
    BitMap.Canvas.TextOut(8, 0, '100');
    Bitmap.Transparent := True;
    Bitmap.TransParentColor := Bitmap.Canvas.Pixels[0, 31]; // Bottom left
    ImageList1.ReplaceMasked(0, BitMap, Bitmap.TransParentColor);
  finally
    Bitmap.Free;
  end;
end;

Теперь добавьте непрозрачное растровое изображение в список изображений (измените размер в соответствии с вашими предпочтениями. Я использую растровые изображения 32x32 пикселей). По умолчанию компонент показывает Прозрачный цвет как любой нижний левый пиксель. Оставьте все как есть и ОК, измените список изображений. Измените ImageIndex второй кнопки на 0.

Теперь вы должны увидеть растровое изображение, которое вы добавили в список изображений, показанный на второй кнопке, с прозрачным цветом, ну, в общем, прозрачным.

Теперь нажмите первую кнопку. Изображение на второй кнопке меняется, и отображается «100», но все, что было прозрачным, теперь белое.

1 Ответ

0 голосов
/ 04 июля 2019

Решение состоит в том, чтобы изменить Прозрачный цвет в интерфейсе TImageList при добавлении изображения. Я нашел, что лучше всего выбрать clNone в нижней части списка цветов. Это гарантирует, что при добавлении в список изображений прозрачность не применяется к растровому изображению.

Это означает, что растровое изображение в списке изображений показывает свой «фон», и изображение на второй кнопке в конструкторе также показывает этот цвет, но при нажатии первой кнопки изображение меняется на «с помощью» 100 ", но теперь применяется прозрачность.

Это потому, что значение цвета, возвращаемое из Canvas.Pixels[0, 31], является фактическим значением цвета, а не каким-то псевдо-внутренним материалом , который выглядит как 16777215, но на самом деле это не так. Это позволяет ReplaceMasked вызов для правильной работы.

...