ICON を Image List で描画する

VC++ でリソースに取り込んだ5枚の ICON を Image List に登録して描画します。
Image List とは ICON や BMP 画像を登録して番号で参照できるようにした Object で、 簡単な画像の切り出しや透明色を設定する機能もあり、使い方によっては便利な Object です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

★CommonControls

CommonControls は COMCTL32.LIB によって提供される共通の Control です。
このファイルは InternetExplorer などによりアップデートされるのでシステムごとにバージョンが異なります。
バージョンが上がるに従って機能が強化されるので、全てのシステムで動くとは限りません。
基本的な処理を Windows がやってくれるので、標準的な操作を簡単にプログラムできます。
Windows や InternetExplorer がバージョンアップされても昔のスタイルで取り残される心配がありません。

CommonControls の標準的なプログラミングの方法です。
  1. commctrl.h をインクルードします。
  2. comctrl32.lib をリンクします。
  3. initCommonControls() または initCommonControlsEx() を呼び出します。

プロジェクトの設定

  1. 空のプロジェクトを作成して、次のファイルを格納して下さい。
    私は ICON 画像を 32×32 の16色(4 bit)で作成しました。
    色モード(16色)や画像サイズ(32×32)は自由ですが、5枚とも同じでなければなりません。
    Main.cpp メインプログラム
    Main.rc 自前で作成したリソースファイル
    Icon01.ico ウインドウに表示する ICON 画像
    Icon02.ico ウインドウに表示する ICON 画像
    Icon03.ico ウインドウに表示する ICON 画像
    Icon04.ico ウインドウに表示する ICON 画像
    Icon05.ico ウインドウに表示する ICON 画像
  2. Main.cpp と Main.rc を [プロジェクト][既存項目の追加] からプロジェクトに追加します。
    今回は resource.h を使わずにプログラムしています。
  3. ICON 画像を定義したリソースファイル(Main.rc)です。
    テンプレートで作成するとかなりの行になるのですが、本当に必要なのは数行です。
        /////////////////////////////////////////////////////////////////////////////
        //
        // Icon
        //
    
        IDI_ICON1               ICON    DISCARDABLE     "Icon01.ICO"
        IDI_ICON2               ICON    DISCARDABLE     "Icon02.ICO"
        IDI_ICON3               ICON    DISCARDABLE     "Icon03.ICO"
        IDI_ICON4               ICON    DISCARDABLE     "Icon04.ICO"
        IDI_ICON5               ICON    DISCARDABLE     "Icon05.ICO"
        
  4. ビルドに続いて実行を行います。
    ページ先頭の画像のように、ウインドウに5枚のアイコンが並んで表示されたら完成です。

プログラムの説明

  1. CommonControls を使うので commctrl.h をインクルードして #pragma で COMCTL32.LIB を取り込んでいます。
    ライブラリの取り込みは Windows Guid から「パスの設定」を参照して下さい。
    hImage が Image List の定義です。
    Icon_name[5] にリソースで取り込んだアイコンのIDを定義します。
        #include    <windows.h>
        #include    <commctrl.h>
        #pragma     comment(lib,"comctl32.lib")
    
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        HIMAGELIST  hImage;
        LPSTR       Icon_name[5] =
        {  "IDI_ICON1", "IDI_ICON2", "IDI_ICON3", "IDI_ICON4", "IDI_ICON5"  };
        
  2. WinMain() は何時もと同じでウインドウを表示するだけです。
  3. WM_CREATE では InitCommonControls() で初期化します。
    AppInit() 関数で Image List を生成して ICON を登録します。
            case WM_CREATE:
                InitCommonControls();
                AppInit();
                break;
        
  4. WM_PAINT: では ImageList_Draw() で Image List に登録された5枚の ICON を表示します。
    二番目のパラメータ(i)が表示する画像の番号で、四番目(i*60+40)と五番目(70)が座標です。
            case WM_PAINT:
                hdc= BeginPaint (hWnd, &ps);
                for(i=0; i<5; i++)
                    ImageList_Draw(hImage,i,hdc,i*60+40,70,ILD_NORMAL);
                EndPaint(hWnd, &ps);
                break;
        
  5. プログラムを終了する前に Image List を破棄して下さい。
            case WM_DESTROY:
                ImageList_Destroy(hImage);
                PostQuitMessage(0);
                return 0L;
        
  6. Image List を生成して ICON を登録する関数 AppInit() です。
    ImageList_Create() で Image List を生成します。
    32,32 が ICON 画像のサイズで、ILC_COLOR4 が16色(4 bit)の指定で、5が登録する枚数です。
    最後のパラメータには、ゼロを指定して下さい。
    LoadIcon() でリソースから ICON 画像を取得します。
    ImageList_AddIcon() で ICON を Image List に登録します。
        void  AppInit()
        {   HICON       hIcon;
            int         i;
    
            hImage= ImageList_Create(32,32,ILC_COLOR4,5,0);
            if (hImage==NULL)
            {   MessageBox(NULL,"ImageList Create Error","Image List",MB_OK);
                return;
            }
            for(i=0; i<5; i++)
            {   hIcon= (HICON)LoadIcon(g_hInst,Icon_name[i]);
                if (hIcon==NULL)
                {   MessageBox(NULL,"LoadImage Error","Image List",MB_OK);
                    return;
                }
                ImageList_AddIcon(hImage,hIcon);
                DeleteObject(hIcon);
            }
        }
        
  7. C# でも同様のプログラムを作成しているので参考にして下さい。
    超初心者のプログラム入門(C#)から ImageList の基礎 を参照して下さい。
    リンクがエラーになるときは「前田稔の超初心者のプログラム入門」から辿って下さい。

【ヒント】

  1. プログラムの作成に於いて、次の MessageBox() が表示されたときは以下の項目を確認して下さい。
    MessageBox(NULL,"LoadImage Error","Image List",MB_OK);
  2. Main.rc がプロジェクトに組み込まれているか確認して下さい。
    プロジェクトに組み込むとリソース表示の画面でアイコン画像が表示されます。
  3. グローバル領域で定義されている g_hInst にインスタンスを格納して下さい。
    g_hInst は WM_CREATE: から参照されるので WinMain() の先頭で格納して下さい。
  4. 同様に g_hWnd にはウインドウハンドルを格納して下さい。
    g_hWnd はウインドウが生成できてから格納しなけれななりません。

【演習】

  1. プログラムを完成させて下さい。
  2. BMP 画像も ICON と同じようにリソースとして登録して表示することができます。
    BMP 画像を登録するソースコードです。
    ImageList_Add(hImage,hBitmap,NULL);
  3. BMP 画像のリソース定義は ICON を設定して BMP 画像を表示する を参照して下さい。

超初心者のプログラム入門(Win32API C++)