2

デスクトップにpngファイルを直接表示することを目的とした小さなソフトウェアに取り組んでいます。HBITMAP 構造体を使用して後半の部分を行う方法を見つけました。それでも、.PNG ファイルをそのような HBITMAP にロードする方法を探すのに何日も費やしました。

最終的に見つけたコード(コンパイルもできた)は、このページの次のコードです。

http://logiklabs.tumblr.com/post/22946728048/how-to-load-an-image-resource-into-a-hbitmap

それは完璧に機能すると思います。私の問題は、これが既に添付されている .png ファイルを使用することを意図していることです。

それでも、実行時に (コンパイル時に) 不明な場所からファイルを使用する可能性が必要です。

では、それを実現するためにそのスクリプトを変更するにはどうすればよいでしょうか? 残念ながら、私の C++ の知識は最高ではなく、これらの関連関数の MS ドキュメントも実際には役に立ちませんでした:/

とても感謝しています!

4

1 に答える 1

3

PNGファイルをRAMにロードして、そのアドレスと長さをstbi_load_from_memory(). 基本的に、リンクされたページのコードの最初の部分を変更して、ファイルを RAM にロードしてから、同じ手順を実行します。以下の例:

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;
}
于 2012-09-24T21:42:13.077 に答える