Как использовать 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.