Когда я использую DirectWrite для рисования текста на HDD GDI, как установить прозрачный фон?

Сейчас я работаю над устаревшим продуктом, который использует GDI для рисования текста на экране. Теперь я пытаюсь использовать DirectWrite для рисования текста для лучшего внешнего вида и точности шрифта. Мне очень любопытно, кто-нибудь делал это раньше?
Я сталкиваюсь с проблемой, что когда я использую DirectWrite для рисования текста на HDD GDI, цвет фона всегда белый, мне нужен прозрачный фон, это возможно? кажется, что SetBkMode бесполезен

Пример кода, как показано ниже,

       SetBkMode(hdc, TRANSPARENT); //hDC is the target GDI dc
SIZE size = {};
HDC memoryHdc = NULL;
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
SetBkMode(memoryHdc, TRANSPARENT);
hr = g_pBitmapRenderTarget->GetSize(&size);
Rectangle(memoryHdc, 0, 0, size1.cx , size1.cy );

if (SUCCEEDED(hr)) {
hr = g_pTextLayout->Draw(NULL, g_pGdiTextRenderer, 0, 0);
}
BitBlt(hdc, x, y, width + 1, height + 1, memoryHdc, 0, 0, SRCCOPY | NOMIRRORBITMAP);

1

Решение

Кистью по умолчанию (Stock) для только что созданного контекста устройства GDI является белая сплошная кисть, поэтому в выводе отображается белый прямоугольник. Увидеть GetStockObject

GDI не работает с прозрачными изображениями, BitBlt заменит все пиксели внутри целевого прямоугольника в целевом DC. Вы должны скопировать содержимое целевого прямоугольника назначения DC в память DC, затем нарисовать текст и скопировать результат обратно для достижения желаемого эффекта.

SetBkMode(hdc, TRANSPARENT); //hDC is the target GDI dc
SIZE size = {};
HDC memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
BitBlt(memoryHdc, 0, 0, width+1, height+1, hdc, x, y, SRCCOPY);

if (SUCCEEDED(hr)) {
hr = g_pTextLayout->Draw(NULL, g_pGdiTextRenderer, 0, 0);
}
BitBlt(hdc, x, y, width + 1, height + 1, memoryHdc, 0, 0, SRCCOPY | NOMIRRORBITMAP);

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

Если приложение использует задний буфер для рисования окон, память DC IDWriteBitmapRenderTarget можно использовать вместо выделения другого — в этом случае вы автоматически решаете проблему прозрачного текстового фона.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector