小さいアイコンのハンドル取得方法


アイコンリソースを作成する際、32×32のものと16×16のものを作成しても LoadIcon で読込まれるのは32×32のサイズのものだけです(環境によって例外あり)。しかし LoadImage というAPIではサイズを指定することができ、対応するサイズのリソースがあればそちらが読込まれます。タイトルバーやタスクトレイに表示されるアイコンのサイズは普通16×16ですが、環境によって変化させることも可能なので GetSystemMetrics に、 SM_CXSMICONSM_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 がクラススタイルに指定されている場合には特に注意してください。


戻る