#include #include #include #include "TestMainWindow.h" #include #include IDWriteFactory *directWriteFactory = nullptr; IDWriteGdiInterop *directWriteGdiInterop = nullptr; typedef HRESULT(WINAPI *DWriteCreateFactoryType)(DWRITE_FACTORY_TYPE, const IID &, IUnknown **); static inline DWriteCreateFactoryType resolveDWriteCreateFactory() { QSystemLibrary library(QStringLiteral("dwrite")); QFunctionPointer result = library.resolve("DWriteCreateFactory"); if (Q_UNLIKELY(!result)) { qWarning("Unable to load dwrite.dll"); return nullptr; } return reinterpret_cast(result); } static void createDirectWriteFactory(IDWriteFactory *&factory) { factory = nullptr; static const DWriteCreateFactoryType dWriteCreateFactory = resolveDWriteCreateFactory(); if (!dWriteCreateFactory) return; IUnknown *result = NULL; dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory2), &result); if (result == NULL) { if (FAILED(dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), &result))) { qErrnoWarning("DWriteCreateFactory failed"); return; } } factory = static_cast(result); } static inline bool initDirectWrite() { if (!directWriteFactory) { createDirectWriteFactory(directWriteFactory); if (!directWriteFactory) return false; } if (!directWriteGdiInterop) { const HRESULT hr = directWriteFactory->GetGdiInterop(&directWriteGdiInterop); if (FAILED(hr)) { qErrnoWarning("%s: GetGdiInterop failed", __FUNCTION__); return false; } } return true; } int main(int argc, char *argv[]) { HDC displayDC = GetDC(0); auto hdc = CreateCompatibleDC(displayDC); ReleaseDC(0, displayDC); initDirectWrite(); IDWriteFontFace *directWriteFontFace = NULL; HRESULT hr = directWriteGdiInterop->CreateFontFaceFromHdc(hdc, &directWriteFontFace); QApplication a(argc, argv); TestMainWindow w; w.show(); return a.exec(); }