2015-05-15 3 views
3

Я пытаюсь добавить изображение в колонку на TDbgrid, которая учитывает прозрачность. При рисовании изображения из TImageList на холсте в процедуре DBGridDrawColumnCell мне нужен фон изображения (того же цвета, что и пиксель в левом нижнем углу), чтобы получить прозрачность. Я хочу, чтобы в этой области прозрачности отображался цвет подсветки или цвет без подсветки, особенно когда используются темы, такие как Aero. Я смог выполнить это в старых версиях Windows с цветовыми значениями clHighlight или clWindow в качестве цвета фона. Но с темами Aero он всегда рисует коробку за непрозрачной частью изображения, а не цвет синего цвета градиента, который использует Aero. Как я могу это сделать?Как добавить изображение с прозрачностью в столбец TDbgrid в delphi?

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

+0

Если Delphi по-прежнему не поддерживает изображения PNG (с возможностями альфа-канала), есть хорошая библиотека [PNGComponents] (http://cc.embarcadero.com/item/26127) – Abelisto

+0

@Abelisto Я пробовал ваш совет и загружал PNGComponents. У этого есть свой собственный lmageList, и я получаю тот же результат без прозрачного фона. Я также обнаружил, что Delphi 2009 + имеет библиотеку PNGImage, которая может быть добавлена ​​в проект при использовании png-изображений. Я не мог заставить его работать с этой библиотекой. Наконец, я смог решить свою проблему. См. Ответ ниже ... –

ответ

1

Я смог наконец определить, как отображать изображения на dbgrid с прозрачностью, даже если используются темы, такие как Aero.

Я использовал обычный TImageList и загрузил изображения, которые мне нужно отобразить на dbgrid. В моем случае их было два, и они были в формате icon (ico). Вместо передачи изображения в растровое изображение, а затем рисунок его в DBGrid холст, как самый старый код рекомендует, я просто использовал следующий простой код в процедуре DBGridDrawColumnCell:

if DataCol=0 then 
begin 
    if (MApptsConflict.Value='<none>') then 
     ImageIndex := 0 
    else 
     ImageIndex := 1; 

    ImageList.Draw(TDBGrid(Sender).Canvas,Rect.Left+2,Rect.Top+2,ImageIndex,True); 
end; 

Это будет рисовать непосредственно на DBGrid холст из TImageList, который даст желаемую прозрачность.

ОБНОВЛЕНИЕ: Я попробовал его с BMP, загруженным в Timagelist, и это сработало.

+0

Зачем вам сначала перенести изображение в растровое изображение? –

+0

@SertacAkyuz, потому что так мой код сделал это раньше, а самые старые методы кода в Интернете научили вас делать это таким образом. Например, [в Delphi.About] (http://delphi.about.com/library/weekly/aa032205a.htm). Возможно, метод ImageList.Draw не был доступен в более ранних версиях Delphi. Но это определенно лучший способ добиться того, что мне нужно. –