Я работаю над небольшим программным обеспечением, которое предназначено для отображения png-файла прямо на рабочем столе. я нашел способ сделать более позднюю часть со структурой HBITMAP. Тем не менее, я потратил несколько дней на поиск способа загрузки файла .PNG в такой HBITMAP.
Код, который я нашел eventuall (который я тоже мог скомпилировать) был на этой странице:
http://logiklabs.tumblr.com/post/22946728048/how-to-load-an-image-resource-into-a-hbitmap
Думаю, это будет работать отлично. Моя проблема, хотя, что этот предназначен для использования уже прикрепленных файлов .png.
Тем не менее мне нужна возможность использовать во время выполнения файл из (во время компиляции) неизвестного места.
Так, как я мог изменить тот сценарий, чтобы достигнуть этого?
Мои знания C ++, к сожалению, не самые лучшие, и MS-документация по этим функциям тоже не помогла: /
Я был бы очень, очень благодарен!
Похоже, вы можете просто загрузить файл PNG в оперативную память и передать его адрес и длину stbi_load_from_memory()
, Вы в основном изменяете первую часть кода на связанной странице, чтобы загрузить файл в оперативную память, а затем продолжаете то же самое. Пример ниже:
static HBITMAP LoadImageResource(LPCTSTR filename)
{
unsigned char *res_data, *splash_image;
DWORD res_size;
int width, height, components;
BITMAPV5HEADER bmh;
HBITMAP hBitmapRet;
FILE* f = _tfopen(filename, "rb");
if (!f)
return NULL;
fseek(f, 0, SEEK_END);
res_size = ftell(f);
rewind(f);
res_data = new unsigned char[res_size];
fread(res_data, sizeof(unsigned char), res_size, f);
fclose(f);
splash_image = stbi_load_from_memory(res_data, res_size, &width, &height, &components, 0);
ZeroMemory(&bmh, sizeof(BITMAPV5HEADER));
bmh.bV5Size = sizeof(BITMAPV5HEADER);
bmh.bV5Width = width;
bmh.bV5Height = -height;
bmh.bV5Planes = 1;
bmh.bV5BitCount = 32;
bmh.bV5Compression = BI_BITFIELDS;
bmh.bV5RedMask = 0x00FF0000;
bmh.bV5GreenMask = 0x0000FF00;
bmh.bV5BlueMask = 0x000000FF;
bmh.bV5AlphaMask = 0xFF000000;
hBitmapRet = CreateDIBitmap(GetDC(NULL), (BITMAPINFOHEADER *) &bmh, CBM_INIT,
splash_image, (BITMAPINFO *) &bmh, DIB_RGB_COLORS);
stbi_image_free(splash_image);
delete[] res_data;
return hBitmapRet;
}
Других решений пока нет …