LoadImage で OEM イメージがロードできない – プログラミング – Home

通知
すべてクリア

[解決済] LoadImage で OEM イメージがロードできない


aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
Topic starter  

日頃お世話になっております。シャノンです。
大したことではないのですが、質問させてください。
環境は 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通りの書き方は、ほぼ同義ではないのでしょうか。

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


引用
トピックタグ
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
Topic starter  

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 を追加してみても、結果は変わりませんでした。


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

> LR_DEFAULTSIZE を追加してみても、結果は変わりませんでした。

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


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
Topic starter  

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

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

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
Topic starter  

解決チェックを忘れておりました


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました