WinAPIでカスタムアイコンにする

本物のページはこちら→custom-icon

Included page "winapi:custom-icon" does not exist (create it now)

自分で作ったWindowsアプリのアイコンを自分のアイコンにしたいなーと思った時、どうすればいいのか、メモ。
sora-draw.png

結果画像

result.png
png画像からアイコン作るのだったらSimplyIconがおすすめ。
simplicon.png

実行ファイル内に隠れるようにする書き方

アイコンを実行ファイル内に隠すにはリソーススクリプトが必要である
.rcファイル

IDC_SORA ICON "sora-draw.ico"

つまり
リソースの名前 リソースの種類 ファイル名

resource.h
#define IDC_SORA 101

resource.hはちゃんと改行して終わらせないと

エラー 1 error RC1004: unexpected end of file found

というエラーが出て怒られる。
main.cpp

#include "resource.h"
....
wc.hIcon = (HICON)LoadImage(          // アイコン
        hInst,"IDC_SORA", IMAGE_ICON,
        0, 0,  LR_SHARED 
    );

フルソースコード

ポイント

  • 第一引数にWinMain関数の第一引数であるインスタンスハンドル(上の例だとhInst)を渡す。(NULLではダメ!)
  • 第2引数に、リソースのID名を文字列で渡す。
  • 最後の引数にLR_LOADFROMFILEというフラグを設定してはならない。("IDC_SORA")がファイル名だと思われるから。

置き場所

こんなかんじにする
folder.png

リソースファイルを設定しなくてもいい、手っ取り早い方法(ただしexeの中に.icoファイルは隠れない)

 WNDCLASSEX wc;
 
    // ウィンドウクラスの情報を設定
    wc.cbSize = sizeof(wc);               // 構造体サイズ
    wc.style = CS_HREDRAW | CS_VREDRAW;   // スタイル
    wc.lpfnWndProc = WndProc;             // ウィンドウプロシージャ
    wc.cbClsExtra = 0;                    // 拡張情報1
    wc.cbWndExtra = 0;                    // 拡張情報2
    wc.hInstance = hInst;                 // インスタンスハンドル
    wc.hIcon = (HICON)LoadImage(          // アイコン
        NULL,"sora-draw.ico", IMAGE_ICON,
        0, 0,  LR_SHARED|LR_LOADFROMFILE 
    );
    wc.hIconSm = wc.hIcon;                // 子アイコン
    wc.hCursor = (HCURSOR)LoadImage(      // マウスカーソル
        NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR,
        0, 0, LR_DEFAULTSIZE | LR_SHARED
    );
    wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH          ); // ウィンドウ背景
    wc.lpszMenuName = NULL;                     // メニュー名
    wc.lpszClassName = "Default Class Name";// ウィンドウクラス名

ポイントはここである
 wc.hIcon = (HICON)LoadImage(          // アイコン
        NULL,"sora-draw.ico", IMAGE_ICON,
        0, 0,  LR_SHARED|LR_LOADFROMFILE 
    );

最後の引数にLR_LOADFROMFILEというフラグを立てることで、リソースファイルを使わずファイルから直接のロードを可能にする。
しかし、この方法だとアイコンファイルがexeの外にあってかっこ悪い。

サポートサイト Wikidot.com