C++で作ったexeにアイコンを設定する

# はじめに
作ったゲームのアプリアイコンを自作の物に変える方法をメモがてら残します。

目指す形はこんな感じ
エクスプローラ上でのアイコン
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/2237e210-b5e5-2b1c-2cee-2b2c81df2ce2.png">
ウィンドウの左上のアイコン
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/5debc71d-8a23-437c-7935-73c4ac239005.png">
タブでのアイコン
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/4c7a874e-d461-93f2-8265-a6dc1e414407.png">

# 環境
・VisualStudio2022：17.11.2
・GIMP：2.10.34　　.ico形式で出力できるソフトであればなんでもいいです。
・C++Ver20

## アイコンを作る
GIMPを立ち上げてファイルの新しい画像をクリック。
![スクリーンショット 2024-09-19 143944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/41974a41-1e04-5996-04b4-0564054cb757.png)

幅と高さを24ピクセルにしてOKをクリック。
![スクリーンショット 2024-09-19 143951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/79208458-9598-84b8-8b7e-0f388b728d98.png)

ブラシのサイズを小さくしてアイコンを作っていきます。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/202cd39b-7efe-dea4-b824-1e58837660fb.png">

完成したらファイルの名前を"icon.ico"、場所を指定してエクスポートをクリック。
ファイルの形式の選択から Mincrosoft Windowsアイコン を選択したら拡張子が自動で".ico"になります。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/cc10d794-fc70-9ab6-61f9-96642a4a45f0.png">

プルダウンメニューから8bpp, 1bitアルファ、256色パレット選択。
プルダウンメニューの左に作ったアイコンが表示されると思います。
圧縮にチェックは入れずにエクスポート。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/756b00ef-758e-ad1a-56d1-945ea39b3f99.png">

**GIMPでの作業は終了！**

## 作ったアイコンを組み込んでいく
プロジェクトフォルダにicon.icoをコピーします。
そしたらプロジェクトを開いて
追加→リソース
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/0b7bdbd3-7d9c-6046-8e8f-2cb9bf08af23.png">

インポートをクリックして作ったアイコンを開く
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/ebbb55a2-92a4-a1d7-4b6f-e1b827323a8c.png">

すると<プロジェクト名>.rcファイルとresource.hが自動で作られます。
.rcを右クリックしてコードを表示。
色々出てくるけど"はい"でOK。

スクロールしていくとこんなのがあると思います。
インポートした"icon.ico"がいますね。
```diff_c
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1               ICON                    "icon.ico"

#endif    // 日本語 (日本) resources
/////////////////////////////////////////////////////////////////////////////
```



**resource.h**
開くとこんなのができてます。
```diff_c
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ で生成されたインクルード ファイル。
// 24_04_24_.rc で使用
//
#define IDI_ICON1                       101
```
IDI_ICON1っていうのが.rcと共通していることが大事だと思われる。

**main.cpp**
この部分を
```diff_c
wcex.hIcon = nullptr;
```
こうします
```diff_c
#include "resource.h"
wcex.hIcon = (HICON)LoadImage(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0);
```

**ビルド！**
そうするとアイコンが設定されていると思います。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/578387eb-2ee8-1d78-4e7b-c2e24e8e45ab.png">
実行して確認すると
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/e00b1123-61d6-4dcd-9da5-ee105fbf7e23.png">
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889028/697286cf-3f4d-c5eb-2cee-b88ecfd97c72.png">

**成功！！**
お疲れさまでした。