リソースに登録したビットマップを表示させる

最終更新 2003 10/01

サンプルのダウンロード → API_Bitmap3.lzh(55k)

リソースに登録したビットマップを表示させるには ビットマップを表示させる
で作った LoadBitmapImage() 関数がそのまま使えます。
ただ、引数を指定するときに少し注意が必要です。
前の項でビットマップをリソースに登録する方法を説明しているので
リソースへの登録方法はそちらをご覧下さい。

リソーススクリプトを作成すると "リソーススクリプト名.h" という
ヘッダファイルが自動的に生成されます。
リソースを利用するには、このヘッダファイルをインクルードする必要が
あります。

リソーススクリプトを作成するときに resource というファイル名を
指定した場合は

    #include "resource.h"

とやれば良いわけです。

で、次に必要なことはリソースに登録したビットマップのリソースIDを
使うときは MAKEINTRESOURCE(リソースID) というマクロを使います。

リソースIDはそのままではただの int 型の数値で、これを使うときは
文字列に変換する必要があります。

MAKEINTRESOURCE は int 型のリソースIDを文字列に変換してくれます。
面倒なら "リソースID" とやっても良いらしいです。(自分はそれで
動いた試しがありませんが・・・。やはり、MAKEINTRESOURCE を
使いましょう。)

前の項で最後に読み込んだビットマップIDに MACHO という名前を
つけましたので、それをそのまま使って、リソースからビットマップを
読み込む例を以下に示します。

#include <windows.h>
#include "resource.h"

#define CLASS_NAME "bitmap sample"

LRESULT CALLBACK WinProc( HWND, UINT, WPARAM, LPARAM );
BOOL LoadBitmapImage( HWND, HDC *, HBITMAP *, LPCSTR );

HDC     memDC;
HBITMAP hBit;

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nShowCmd
)
{
    {
        WNDCLASS wc;    
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
        wc.hCursor       = LoadCursor( NULL, IDC_ARROW );
        wc.hIcon         = LoadIcon( NULL, IDI_WINLOGO );
        wc.hInstance     = hInstance;
        wc.lpfnWndProc   = WinProc;
        wc.lpszClassName = CLASS_NAME;
        wc.lpszMenuName  = NULL;
        wc.style         = 0;
        if( !RegisterClass( &wc ) ) return 1;
    }
    
    HWND hWnd = CreateWindow(
                    CLASS_NAME, "Bitmap Sample",
                    WS_CAPTION | WS_SYSMENU,
                    0, 0, 400, 400,
                    NULL, NULL, hInstance, NULL
                    );
    
    ShowWindow( hWnd, SW_NORMAL );
    UpdateWindow( hWnd );
    
    if(
        !LoadBitmapImage(
             hWnd,
             &memDC, &hBit,
             MAKEINTRESOURCE( MACHO )
             )
    ) return 1;

    while( true )
    {
        MSG msg;
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            if( msg.message == WM_QUIT ) break;
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
        else
        {
            HDC hDC = GetDC( hWnd );
            BitBlt( hDC, 0, 0, 368, 316, memDC, 0, 0, SRCCOPY );
            ReleaseDC( hWnd, hDC );
            Sleep( 100 );
        }
    }

    DeleteObject( hBit );
    DeleteDC( memDC );

    return 0;
}

LRESULT CALLBACK WinProc(
    HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    switch( uMsg )
    {
    case WM_DESTROY:
        
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}

BOOL LoadBitmapImage(
    HWND hWnd,
    HDC *pMemDC,
    HBITMAP *pHBit,
    LPCSTR lpImageName
)
{
    HDC hDC = GetDC( hWnd );
    
    *pMemDC = CreateCompatibleDC( hDC );

    *pHBit = (HBITMAP)LoadImage(
                 (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ),
                 MAKEINTRESOURCE( lpImageName ),
                 IMAGE_BITMAP,
                 0, 0,
                 LR_CREATEDIBSECTION
                 );

    if( *pHBit == NULL )
    {
        *pHBit = (HBITMAP)LoadImage(
                     NULL,
                     lpImageName,
                     IMAGE_BITMAP,
                     0, 0,
                     LR_CREATEDIBSECTION | LR_LOADFROMFILE
                     );
        
        if( *pHBit == NULL ) return FALSE;
    }
    
    SelectObject( *pMemDC, *pHBit );

    ReleaseDC( hWnd, hDC );

    return TRUE;
}
「ビットマップを表示させる」のソースからの変更点を赤く表示しました。 ご覧の通り2ヶ所しか変わっていません。

| next | back | home |