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);
}
По итогу сохраняется картинка без текста.