Если вы хотите рисовать текст без заливки фона, SetBkMode (hdc, TRANSPARENT)
укажет GDI оставить фон при рисовании текста.
Для фактического рендеринга цвет переднего плана текста с альфа-каналом ... будет более сложным. GDI не так широко поддерживает альфа-каналы в своих API. За пределами AlphaBlend на самом деле все, что он делает, это сохраняет канал. На самом деле недопустимо устанавливать верхние биты COLOREF в альфа-значения, поскольку старший байт фактически используется для флагов, чтобы указать, является ли COLOREF (а не значением RGB) записью палитры.
Так что, к сожалению, ваш единственный реальный путь вперед:
- Создайте 32-битный DIBSection. ( CreateDIBSection ). Это дает вам HBITMAP, который гарантированно может содержать альфа-информацию. Если вы создаете растровое изображение с помощью одной из других функций создания растрового изображения, оно будет на глубине цвета устройства, которая может быть не 32bpp.
- DrawText на DIBSection.
- Когда вы создали DIBSection, вы получили указатель на фактический объем памяти. На этом этапе вам нужно просмотреть память и установить альфа-значения. Я не думаю, что DrawText вообще что-нибудь сделает с альфа-каналом. Я думаю о простой проверке компонентов RGB каждого DWORD растрового изображения - если это основной цвет, перепишите DWORD с 50% (или любым другим) альфа в альфа-байте, если это цвет фона, перезапишите со 100% альфа в байте альфа. *
- AlphaBlend растровое изображение в конечный пункт назначения. AlphaBlend требует предварительного умножения альфа-канала в источнике.
*
Нарисовать текст в DIBSection.
Когда вы создали DIBSection, вы получили указатель на фактическую память. На этом этапе вам нужно просмотреть память и установить альфа-значения. Я не думаю, что DrawText вообще что-нибудь сделает с альфа-каналом. Я думаю о простой проверке компонентов RGB каждого DWORD растрового изображения - если это основной цвет, перепишите DWORD с 50% (или любым другим) альфа в альфа-байте, если это цвет фона, перезапишите со 100% альфа в байте альфа. *
AlphaBlend растровое изображение в конечный пункт назначения. AlphaBlend требует предварительного умножения альфа-канала в источнике.
*
Нарисовать текст в DIBSection.
Когда вы создали DIBSection, вы получили указатель на фактическую память. На этом этапе вам нужно просмотреть память и установить альфа-значения. Я не думаю, что DrawText вообще что-нибудь сделает с альфа-каналом. Я думаю о простой проверке компонентов RGB каждого DWORD растрового изображения - если это основной цвет, перепишите DWORD с 50% (или любым другим) альфа в альфа-байте, если это цвет фона, перезапишите со 100% альфа в байте альфа. *
AlphaBlend растровое изображение в конечный пункт назначения. AlphaBlend требует предварительного умножения альфа-канала в источнике.
* На этом этапе вам нужно просмотреть память и установить альфа-значения. Я не думаю, что DrawText вообще что-нибудь сделает с альфа-каналом. Я думаю о простой проверке компонентов RGB каждого DWORD растрового изображения - если это основной цвет, перепишите DWORD с 50% (или любым другим) альфа в альфа-байте, если это цвет фона, перезапишите со 100% альфа в байте альфа. *
AlphaBlend растровое изображение в конечный пункт назначения. AlphaBlend требует предварительного умножения альфа-канала в источнике.
* На этом этапе вам нужно просмотреть память и установить альфа-значения. Я не думаю, что DrawText вообще что-нибудь сделает с альфа-каналом. Я думаю о простой проверке компонентов RGB каждого DWORD растрового изображения - если это основной цвет, перепишите DWORD с 50% (или любым другим) альфа в альфа-байте, если это цвет фона, перезапишите со 100% альфа в байте альфа. *
AlphaBlend растровое изображение в конечный пункт назначения. AlphaBlend требует предварительного умножения альфа-канала в источнике.
* перепишите DWORD с альфа-значением 50% (или любым другим) в альфа-байте, если это цвет фона, перезапишите со 100% -ным альфа-значением в альфа-байте. *
AlphaBlend растровое изображение в конечный пункт назначения. AlphaBlend требует, чтобы альфа-канал в источнике был предварительно умножен.
* перепишите DWORD с альфа-значением 50% (или любым другим) в альфа-байте, если это цвет фона, перезапишите со 100% -ным альфа-значением в альфа-байте. *
AlphaBlend растровое изображение в конечный пункт назначения. AlphaBlend требует предварительного умножения альфа-канала в источнике.
*
Может быть достаточно просто запомнить DIBSection с 50% альфа перед выполнением DrawText и убедиться, что BKColor черный. Я не знаю, что DrawText может сделать с альфа-каналом. Требуются некоторые эксперименты.