LoadImage で OEM イメージがロードできない

[戻る]
シャノン 2005/05/08(日) 20:27:40
日頃お世話になっております。シャノンです。
大したことではないのですが、質問させてください。
環境は 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通りの書き方は、ほぼ同義ではないのでしょうか。

ご存知の方がいらっしゃいましたら、どうかご教示願えませんでしょうか。

シャノン 2005/05/08(日) 20:29:32
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 を追加してみても、結果は変わりませんでした。

瀬戸っぷ [E-Mail] 2005/05/09(月) 01:21:34
> LR_DEFAULTSIZE を追加してみても、結果は変わりませんでした。

LR_SHAREDを付けてみてはどうでしょうか?

シャノン 2005/05/09(月) 20:17:24
> LR_SHAREDを付けてみてはどうでしょうか?

うまく行きました。ありがとうございます!

何故これでうまく行くのだろうと思って調べてみたら、英語の原典には書いてあったんですね。
やっぱり日本語 MSDN はあまりアテにならないのでしょうか…

> When loading a system icon or cursor, you must use LR_SHARED or the function 
will fail to load the resource.

シャノン 2005/05/10(火) 00:08:38
[[解決]]
解決チェックを忘れておりました

古いスレッドには追加発言できません。