アイコンリソースを作成する際、32×32のものと16×16のものを作成しても
LoadIcon
で読込まれるのは32×32のサイズのものだけです(環境によって例外あり)。しかし LoadImage
というAPIではサイズを指定することができ、対応するサイズのリソースがあればそちらが読込まれます。タイトルバーやタスクトレイに表示されるアイコンのサイズは普通16×16ですが、環境によって変化させることも可能なので GetSystemMetrics
に、 SM_CXSMICON
や SM_CYSMICON
をわたすことで取得します。
(例) IDI_MYICON
の小さなアイコンを読込んでタスクトレイに登録する。
- NOTIFYICONDATA nid;
- nid.cbSize = sizeof nid;
- nid.hWnd = m_hWnd;
- nid.uID = 1;
- nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
- nid.uCallbackMessage = MYWM_NOTIFYICON;
- nid.hIcon = ::LoadImage(AfxGetResourceHandle(),
- MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON,
- ::GetSystemMetrics(SM_CXSMICON),
- ::GetSystemMetrics(SM_CYSMICON), 0);
- GetWindowText(nid.szTip, sizeof nid.szTip / sizeof nid.szTip[0]);
- ::Shell_NotifyIcon(NIM_ADD, &nid);
- ::DestroyIcon(nid.hIcon);
また、 CopyImage
というAPIに
LR_COPYFROMRESOURCE
を渡すことにより LoadIcon
で読込んだアイコンハンドルから別のサイズのアイコンリソースを読込むことができます。
(例)アイコンを IDI_MYICON2
にセットし、タスクトレイのアイコンも変更する。
- HICON hBigIcon = AfxGetApp()->LoadIcon(IDI_MYICON2);
- SetIcon(hBigIcon, TRUE);
- nid.cbSize = sizeof nid;
- nid.hWnd = m_hWnd;
- nid.uID = 1;
- nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
- nid.uCallbackMessage = MYWM_NOTIFYICON;
- nid.hIcon = (HICON) ::CopyImage(hBigIcon,
- IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON),
- ::GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE);
- GetWindowText(nid.szTip, sizeof nid.szTip / sizeof nid.szTip[0]);
- ::Shell_NotifyIcon(NIM_MODIFY, &nid);
- ::DestroyIcon(nid.hIcon);
またウィンドウクラスを登録する際に小さなアイコンを指定しなければ、大きなアイコンに指定したアイコンの小さなアイコンが自動的に設定されるので、
GetClassLong
という API を使用すれば、もっと簡単に小さなアイコンが取得できます。
(例)アイコンを IDI_MYICON2
にセットし、タスクトレイのアイコンも変更する。
- :SetClassLong(m_hWnd, GCL_HICON, AfxGetApp()->LoadIcon(IDI_MYICON2));
- nid.cbSize = sizeof nid;
- nid.hWnd = m_hWnd;
- nid.uID = 1;
- nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
- nid.uCallbackMessage = MYWM_NOTIFYICON;
- nid.hIcon = (HICON) ::GetClassLong(m_hWnd, GCL_HICONSM);
- GetWindowText(nid.szTip, sizeof nid.szTip / sizeof nid.szTip[0]);
- ::Shell_NotifyIcon(NIM_MODIFY, &nid);
- ::DestroyIcon(nid.hIcon);
ただし、この方法では同じウィンドウクラスを使用しているウィンドウのアイコンすべてが変更されてしまいます。 CS_GLOBALCLASS
がクラススタイルに指定されている場合には特に注意してください。