日頃お世話になっております。シャノンです。
大したことではないのですが、質問させてください。
環境は WinXP SP2 Pro + VC++ 7.1 Pro + Platform SDK for WinXP SP2 です。
MFC を使わず、SDK で Win32 プログラムを作っていて、ウィンドウクラスを登録すると
ころで、普通は LoadIcon を使うと思います。
が、LoadIcon のヘルプには「LoadImage に取って代わられました」と書いてあるので、
「じゃあせっかくだから新しいほうを使おうか」と、LoadImage を使ってみたところ、
アイコンがロードできません。
書いたコードはこんな感じです。
Win32 プロジェクトのデフォルトのスケルトンと違うところだけ掲載します。
1.stdafx.h の #include <windows.h> の前に、#define OEMRESOURCE を追加
2.<プロジェクト名>.cpp の MyRegisterClass のアイコンロード部分を、以下のように
変更
#if !defined( USE_LOADIMAGE )
wcex.hIcon = LoadIcon( NULL, IDI_ASTERISK );
wcex.hIconSm = LoadIcon( NULL, IDI_ASTERISK );
#else
wcex.hIcon = reinterpret_cast< HICON >(
LoadImage( NULL, MAKEINTRESOURCE( OIC_NOTE ),
IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR ) );
wcex.hIconSm = reinterpret_cast< HICON >(
LoadImage( NULL, MAKEINTRESOURCE( OIC_NOTE ),
IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR ) );
#endif
3.USE_LOADIMAGE を #define したりしなかったりして実験
で、LoadIcon は成功しますが、LoadImage が NULL を返します。
GetLastError は 1813 ― ERROR_RESOURCE_TYPE_NOT_FOUND。エラーメッセージは「指定
されたリソースの種類がイメージ ファイルに見つかりません」だそうです。
ちなみに、自アプリのインスタンスからアイコンをロード(第一引数に非 NULL を指
定)の場合は成功します。
また、IDI_ASTERISK と OIC_NOTE は同じ ID として定義されています。
なぜ LoadIcon は成功するのに、LoadImage は失敗するのでしょうか。
上の2通りの書き方は、ほぼ同義ではないのでしょうか。
ご存知の方がいらっしゃいましたら、どうかご教示願えませんでしょうか。
hIcon と hIconSm のサイズ指定が逆でした… orz
wcex.hIcon = reinterpret_cast< HICON >(
LoadImage( NULL, MAKEINTRESOURCE( OIC_NOTE ),
IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR ) );
wcex.hIconSm = reinterpret_cast< HICON >(
LoadImage( NULL, MAKEINTRESOURCE( OIC_NOTE ),
IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR ) );
これが正解です。
が、0, 0 にしても、GetSystemMetrics で取得した値を指定してみても、フラグに
LR_DEFAULTSIZE を追加してみても、結果は変わりませんでした。
> LR_DEFAULTSIZE を追加してみても、結果は変わりませんでした。
LR_SHAREDを付けてみてはどうでしょうか?
> LR_SHAREDを付けてみてはどうでしょうか?
うまく行きました。ありがとうございます!
何故これでうまく行くのだろうと思って調べてみたら、英語の原典には書いてあったんですね。
やっぱり日本語 MSDN はあまりアテにならないのでしょうか…
> When loading a system icon or cursor, you must use LR_SHARED or the function
will fail to load the resource.
解決チェックを忘れておりました