GDI-могу ли я использовать новый Windows 10 Segoe UI Emoji цветной шрифт с DrawText?

Я создаю проект на c++ с помощью Embarcadero RAD Studio (10.2 Tokyo starter) и Windows GDI для рисования текста с помощью функции DrawText ().

недавно я видел, что Windows 10 предоставляет новый шрифт "Segoe UI Emoji", который потенциально позволяет текстовым функциям рисовать цветные смайлики. Я нашел несколько примеров использования Direct2D, но ни один с чистыми функциями GDI.

Я также попробовал простой код, например:

HDC hDC = ::GetDC(Handle);

std::auto_ptr<TCanvas> pCanvas(new TCanvas());
pCanvas->Handle = hDC;

pCanvas->Brush->Color = clWhite;
pCanvas->Brush->Style = bsSolid;
pCanvas->FillRect(TRect(0, 0, ClientWidth, ClientHeight));

const std::wstring text = L"Test 

2 ответов


GDI не поддерживает цветные шрифты (даже если вы идете полным маршрутом Uniscribe), вы должны использовать Direct2D, если хотите поддержку цветного шрифта. Имеет смысл, что более простые API GDI не поддерживают цветные шрифты, поскольку цветные шрифты требуют использования тегов OpenType, и ни один из DrawText / TextOut не обеспечивает такого уровня управления, Uniscribe допускает такие теги, но просто не был расширен для поддержки цветных шрифтов.


вы можете использовать DirectWrite для рисования цветных смайликов на растровое изображение в памяти DC, а затем BitBlt() в конечный DC. В основном вам нужно реализовать пользовательский класс IDWriteTextRenderer и вызвать IDWriteTextLayout:: Draw() с вашим визуализатором, а затем скопировать результат. В вашем классе, вы получаете IDWriteGdiInterop от IDWriteFactory и называть IDWriteGdiInterop::CreateBitmapRenderTarget (), чтобы получить растровое изображение целевого объекта отрисовки; называть IDWriteFactory::CreateMonitorRenderingParams() для получения перевода параметры и вызовите IDWriteFactory:: CreateTextFormat() для настройки текстового формата. Единственным значимым методом является DrawGlyphRun (), где вы получаете IDWriteColorGlyphRunEnumerator с IDWriteFactory2::TranslateColorGlyphRun () и при каждом запуске цвета вызываете IDWriteBitmapRenderTarget::DrawGlyphRun (), чтобы выполнить работу за вас. Просто не забудьте обновить цель/параметры рендеринга при изменении размера/положения окна. Вы можете ссылаться на эту документацию MSDN:

визуализация в GDI Поверхность https://msdn.microsoft.com/en-us/library/windows/desktop/ff485856(v=vs. 85).aspx