Как использовать Direct 2D для рисования текста в принтере DC?

Я использую прямой 2d API, чтобы правильно рисовать текст в GDI dc,

но когда я использую тот же код для рисования текста в DC принтера, это не удалось,

Принтер HDC создать, как показано ниже,

   hdc = CreateDC("WINSPOOL", printerName, "", pdevMode);

Фрагмент кода прямого рисования 2d текста, как показано ниже

    if (p_d2dFactory == NULL) {
        hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &p_d2dFactory);
    }      

    if (SUCCEEDED(hr) && p_dcTarget == NULL) {
        hr = p_d2dFactory->CreateDCRenderTarget(&props, &p_dcTarget);
    }

    if (SUCCEEDED(hr)) {
        hr = p_dcTarget->BindDC(hdc, &rc);
    }

    if (SUCCEEDED(hr)) {      
        p_dcTarget->BeginDraw();
        p_dcTarget->Clear(NULL);
        p_dcTarget->DrawTextLayout(origin, g_pTextLayout,p_dbrush);
        hr= p_dcTarget->EndDraw();
    }

К сожалению, p_dcTarget не может правильно связать HDC, поэтому ничего не распечатывается,

но если hdc - это GDI dc для рисования текста в окне, он будет успешно связан, а затем выведет правильный текст.

Есть ли что-то другое при привязке принтера к DC?

Любое предложение для этой проблемы? Благодарю.

1 ответ

Согласно этому обсуждению на MSDN, вы не можете печатать напрямую с Direct2D на DC принтера. Вместо этого вам необходимо выполнить рендеринг в растровое изображение в памяти, а затем скопировать это растровое изображение на принтер с BitBlt или же StretchBlt,

Документация MSDN о совместимости GDI и Direct2D указывает на то, что, даже если Direct2D действительно работал с контроллерами домена принтера, он делал бы это внутренне:

Когда вы используете ID2D1DCRenderTarget, он отображает содержимое Direct2D во внутреннюю битовую карту, а затем отображает битовую карту в DC с GDI.

Другие вопросы по тегам