2015-04-21 6 views
0

У меня есть приложение, которое отображает глифы в контекст устройства принтера. Раньше он использовал GDI, и он работал нормально. Но теперь я пытаюсь использовать Directwrite.IDWriteGdiInterop :: CreateBitmapRenderTarget сбой

Я изменил существующий вызов ExtTextOut и использовал функцию IDWriteTextLayout :: Draw.

Мне нужно передать объект, реализующий интерфейс IDWriteTextRenderer в функции рисования.

Я реализовал обратный вызов DrawGlyphRun в интерфейсе IDWriteTextRenderer, используя вызов IDWriteBitmapRenderTarget :: DrawGlyphRun. Итак, мне нужно создать объект IDWriteBitmapRenderTarget.

У меня есть следующий код:

IDWriteFactory* pDWriteFactory = NULL; 
IDWriteGdiInterop* pGdiInterop = NULL; 
IDWriteTextLayout* pTextLayout = NULL; 
IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL; 
IDWriteRenderingParams* pRenderingParams = NULL; 

hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, 
    __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&pDWriteFactory)); 

if (!SUCCEEDED(hr)) 
    pDWriteFactory = 0; 
else 
{ 
    hr = pDWriteFactory->GetGdiInterop(&pGdiInterop); 
    if (!SUCCEEDED(hr)) 
     pGdiInterop = 0; 
} 

hr = pGdiInterop->CreateBitmapRenderTarget((HDC)hDC, someWidth, someHeight, &pBitmapRenderTarget); 

Контекст устройства HDC в настоящее время передается функцией в другой DLL.

Результат: ч = E_FAIL

Может быть, я не хватает на что-то очень простой, но у меня мало знаний контекстов устройств и я новичок в DirectWrite. Мне нужно знать, почему одна и та же структура HDC, совместимая с вызовом ExtTextOut, несовместима с DirectWrite.

Кроме того, поскольку поле HDC не является обязательным, если я передаю NULL, он преуспевает, но ничто не будет отображаться функцией draw. Что означает пропуск NULL?

ответ

0

Прежде всего убедитесь, что hDC является допустимым контекстом устройства памяти, важна часть памяти. Аргумент NULL означает, что цель создает свой собственный контекст, совместимый с экраном/рабочим столом. В любом случае ничего не будет сделано автоматически, вам нужно blit себя от HDC, возвращаемого GetMemoryDC, в ваш контекст, другими словами, цель рисует только эту память DC, и то, что вы делаете дальше, зависит от вас.

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

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