2017-01-19 29 views
1

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

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

 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); 

ответ

0

По умолчанию (со) кисточкой для свежа созданного контекста устройства 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

Здравствуйте, nekavally, спасибо за вашу помощь, я попробовал вашу идею, но она не работает, я не уверен в причине. Теперь я переключаюсь на использование прямого 2d api для рисования текста в GDI dc, он работает. – Southwind1984

 Смежные вопросы

  • Нет связанных вопросов^_^