Йес! Я сделал это!!!
В хелпе по SetTextColor прочитал, что "The text color is also used in converting bitmaps from color to monochrome and vice versa". В других местах тоже попадалось, что если монохромный битмап выводить на полноцветный DC, то белые пикселы будут выводиться цветом фона (SetBkColor), а черные — цветом текста (SetTextColor). Но все эксперименты к успеху не привели. Пришлось подключить тяжелую артиллерию (Фень Юаня) и тщательное изучение исходников. Предположительно, причина была в том, что при использовании TBitmap.LoadFromFile создаваемый объект не является монохромным битмапом, хотя файл BMP и содержит монохромный битмап.
Сейчас решил честно все создать на Win API. И все заработало
const
Data: array[0..31] of Byte = (
$FF,$F0,$FF,$F0,$80,$70,$CF,$30,$CF,$90,$CF,$90,$CF,$30,$C0,$70,
$CF,$30,$CF,$90,$CF,$90,$CF,$90,$CF,$30,$80,$70,$FF,$F0,$FF,$F0);
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
BM, SaveBM: HBITMAP;
MonoDC: HDC;
begin
MonoDC := CreateCompatibleDC(0);
BM := CreateBitmap(12, 16, 1, 1, @Data);
SaveBM := SelectObject(MonoDC, BM);
SetBkColor(Canvas.Handle, clBlue);
SetTextColor(Canvas.Handle, clYellow);
BitBlt(Canvas.Handle, 8, 8, 12, 16, MonoDC, 0, 0, SRCCOPY);
SelectObject(MonoDC, SaveBM);
DeleteDC(MonoDC);
DeleteObject(BM);
end; |