GdipDrawString не выводит строку

Я генерирую динамически картинку с черным фоном и красным текстом на ней. Текста не видно.

typedef enum Status {
    Ok = 0,
    GenericError = 1,
    InvalidParameter = 2,
    OutOfMemory = 3,
    ObjectBusy = 4,
    InsufficientBuffer = 5,
    NotImplemented = 6,
    Win32Error = 7,
    WrongState = 8,
    Aborted = 9,
    FileNotFound = 10,
    ValueOverflow = 11,
    AccessDenied = 12,
    UnknownImageFormat = 13,
    FontFamilyNotFound = 14,
    FontStyleNotFound = 15,
    NotTrueTypeFont = 16,
    UnsupportedGdiplusVersion = 17,
    GdiplusNotInitialized = 18,
    PropertyNotFound = 19,
    PropertyNotSupported = 20,
    ProfileNotFound = 21
};
 
 
typedef struct {
    Status(WINAPI* pfnGdiplusStartup)(ULONG_PTR*, void*, void*);
    VOID(WINAPI* pfnGdiplusShutdown)(ULONG_PTR);
    Status(WINAPI* pfnGdipSaveImageToFile)(void*, const WCHAR*, const CLSID*, const void*);
    Status(WINAPI* pfnGdipCreateBitmapFromHBITMAP)(HBITMAP, HPALETTE, void**);
    Status(WINAPI* pfnGdipCreateFromHDC)(HGDIOBJ, void*);
    Status(WINAPI* pfnGdipDeleteGraphics)(int);
    Status(WINAPI* pfnGdipCreateBitmapFromScan0)(INT,INT, INT, INT,BYTE*, void**);
    Status(WINAPI* pfnGdipGetImageGraphicsContext)(void*, void**);
    Status(WINAPI* pfnGdipGraphicsClear)(void*, DWORD);
    Status(WINAPI* pfnGdipCreateFont)(void*, INT, INT, INT, void**);
    Status(WINAPI* pfnGdipGetGenericFontFamilySansSerif)(void**);
    Status(WINAPI* pfnGdipDrawString)(void*, wchar_t*, INT, void*, Gdiplus::RectF*, void*, void*);
    Status(WINAPI* pfnGdipCreateSolidFill)(DWORD, void**);
}DYN_DLLS, * LPDYN_DLLS;
 
void f(){
DYN_DLLS DynDlls;
    HMODULE hGDIPlsu = LoadLibraryW(L"gdiplus.dll");
    (FARPROC&)DynDlls.pfnGdiplusStartup = GetProcAddress(hGDIPlsu, "GdiplusStartup");
    (FARPROC&)DynDlls.pfnGdiplusShutdown = GetProcAddress(hGDIPlsu, "GdiplusShutdown");
    (FARPROC&)DynDlls.pfnGdipSaveImageToFile = GetProcAddress(hGDIPlsu, "GdipSaveImageToFile");
    (FARPROC&)DynDlls.pfnGdipCreateFromHDC = GetProcAddress(hGDIPlsu, "GdipCreateFromHDC");
    (FARPROC&)DynDlls.pfnGdipDeleteGraphics = GetProcAddress(hGDIPlsu, "GdipDeleteGraphics");
    (FARPROC&)DynDlls.pfnGdipCreateBitmapFromScan0 = GetProcAddress(hGDIPlsu, "GdipCreateBitmapFromScan0");
    (FARPROC&)DynDlls.pfnGdipGetImageGraphicsContext = GetProcAddress(hGDIPlsu, "GdipGetImageGraphicsContext");
    (FARPROC&)DynDlls.pfnGdipGraphicsClear = GetProcAddress(hGDIPlsu, "GdipGraphicsClear");
    (FARPROC&)DynDlls.pfnGdipCreateFont = GetProcAddress(hGDIPlsu, "GdipCreateFont");
    (FARPROC&)DynDlls.pfnGdipGetGenericFontFamilySansSerif = GetProcAddress(hGDIPlsu, "GdipGetGenericFontFamilySansSerif");
    (FARPROC&)DynDlls.pfnGdipDrawString = GetProcAddress(hGDIPlsu, "GdipDrawString");
    (FARPROC&)DynDlls.pfnGdipCreateSolidFill = GetProcAddress(hGDIPlsu, "GdipCreateSolidFill");
 
    void* bitmap = nullptr;
    void* gpgraphics = nullptr;
    void* font = nullptr;
    void* fontfamily = nullptr;
    void* solidbrush = nullptr;
    wchar_t* img_message = L"message";
 
    ULONG_PTR gditoken;
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    Status stat = DynDlls.pfnGdiplusStartup(&gditoken, &gdiplusStartupInput, NULL);
    RECT desktop_size;
    GetClientRect(GetDesktopWindow(), &desktop_size);
    HDC hdc = GetDC(NULL);
    stat = DynDlls.pfnGdipCreateBitmapFromScan0(desktop_size.right, desktop_size.bottom - 5, 0, 2498570, NULL, (void**)&bitmap);
    stat = DynDlls.pfnGdipGetImageGraphicsContext(bitmap, &gpgraphics);
    stat = DynDlls.pfnGdipGraphicsClear(gpgraphics, 0xFF000000);
    stat = DynDlls.pfnGdipGetGenericFontFamilySansSerif(&fontfamily);
    stat = DynDlls.pfnGdipCreateFont(fontfamily, 30, 0, 3, &font);
    stat = DynDlls.pfnGdipCreateSolidFill(0xFFFF0000, &solidbrush);
    Gdiplus::RectF rect{ (Gdiplus::REAL)(desktop_size.right / 2 - (desktop_size.right / 4)) , (Gdiplus::REAL)(desktop_size.bottom / 2 - (desktop_size.bottom / 4)), 0,0 };
    stat = DynDlls.pfnGdipGetImageGraphicsContext(bitmap, &gpgraphics);
    stat = DynDlls.pfnGdipDrawString(gpgraphics, img_message, lstrlenW(img_message), font, &rect, NULL, solidbrush);
    CLSID pngClsid;
    CLSIDFromString(L"{557cf401-1a04-11d3-9a73-0000f81ef32e}", &pngClsid);
    stat = DynDlls.pfnGdipSaveImageToFile(bitmap, L"img.png", &pngClsid, NULL);
}

По итогу сохраняется картинка без текста.


Ответы (0 шт):