タスクトレイにアイコンを表示するには

解決


バンピー  2007-12-07 16:53:20  No: 67131  IP: 192.*.*.*

タスクトレイにアイコンを表示したいのですが、うまく表示できません。
環境は  VC++2005 API  です。
調べた結果以下のコードでアイコンが表示されるみたいなのですが、
hIconになにも格納されず、また、プログラム実行後タスクトレイに
なにも表示されないけど透明なアイコンが格納されているみたいに
なります。
原因はなんなのでしょうか・・・
アドバイスよろしくおねがいします。

.rc///////////////////////////////////////////////////////
IDI_ICON1               ICON                    "icon1.ico"

.cpp/////////////////////////////////////////////////////
#define IDI_ICON1                       133

hIcon LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON1));
icdata.cbSize=sizeof(NOTIFYICONDATA);
icdata.hWnd=hWnd;
icdata.uID=MY_ICON;
icdata.uFlags= NIF_MESSAGE | NIF_TIP | NIF_ICON ;
icdata.uCallbackMessage=WM_USER;
icdata.hIcon=hIcon;
CopyMemory(icdata.szTip,"Test",5);

Shell_NotifyIcon(NIM_ADD,&icdata);

編集 削除
ゴン  2007-12-07 19:35:48  No: 67132  IP: 192.*.*.*

hIcon = ::LoadImage(NULL, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);

を使ってもだめでしょうか?

編集 削除
バンビー  2007-12-07 22:25:32  No: 67133  IP: 192.*.*.*

'HANDLE' から 'HICON' に変換できません。とエラーがでます。
hIcon=(HICON)(NULL,MAKEINTRESOURCE(IDI_ICON4),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
にするとビルドできるのですが、アイコンが表示されないままです;;
アイコンのサイズが32×32なので第3、4引数を32に変えても無理でした;;

編集 削除
瀬戸っぷ  2007-12-08 00:21:31  No: 67134  IP: 192.*.*.*

hIcon = LoadIcon(NULL, "IDI_ICON1");
ではどうでしょうか?

.cppで
#define IDI_ICON1                       133
しているだけ…ですか?
.rcにも
#define IDI_ICON1                       133
は適用されていますか??

編集 削除
バンビー  2007-12-08 00:37:19  No: 67135  IP: 192.*.*.*

>hIcon = LoadIcon(NULL, "IDI_ICON1");
変わりません;;

.cppというよりResouse.hに書いておりインクルードしています。
#define IDI_ICON1     133

.rcには
IDI_ICON1  ICON   "icon1.ico"
だけですがインクルードしているので問題ないのでは。

shellapi.hをインクルードしなければShell_NotifyIconやNOTIFYICONDATAが
使えないのはなにか関係していますでしょうか。

編集 削除
夏みかん  2007-12-08 00:44:17  No: 67136  IP: 192.*.*.*

> hIcon = ::LoadImage(NULL, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
LoadImage 関数の第1引数に NULL 指定するとリソースを読み込めないんじゃないのかな。多分。
ちゃんとモジュールのインスタンスハンドルを指定すべきかと思います。
指定すればアイコンも表示されるかもね。

HINSTANCE hInstance;
HICON hIcon;

hInstance = (HINSTANCE)(INT64)GetWindowLong( hWnd, GWL_HINSTANCE );
hIcon = (HICON)LoadImage( hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 0, 0, LR_SHARED );

それから LR_DEFAULTCOLOR 定数は付けないほうが良いでしょう。
付けなければリソースのアイコンのサイズが使われるため、16、32 を指定しなくても良いよ。
また LoadImage 関数を使うときは必ずキャストする必要があります。

これでもアイコンが表示しない場合は、GetWindowLong、LoadImage の戻り値を調べて下さい。
表示されなければ NULL が返っているかも。
要するに期待通りに動作しないときは、全ての戻り値のエラーチェックをしましょう。

編集 削除
バンビー  2007-12-08 01:00:15  No: 67137  IP: 192.*.*.*

お返事ありがとうございます。
>これでもアイコンが表示しない場合は、GetWindowLong、LoadImage の戻り値を調べて下さい。
しらべてみるとGetWindowLong、LoadImage どちらもNULLが返っていました。
アイコンの登録はできていると思うのですが、なにかおかしいところはあるでしょうか。

編集 削除
バンビー  2007-12-08 01:25:01  No: 67138  IP: 192.*.*.*

夏みかんさんがおっしゃったとおり、WinMainの第一引数のインスタンスを
LoadImageに指定することで解決しました!!

ゴンさん、瀬戸っぷさん、夏みかんさん  ほんとにありがとうございました!!

編集 削除
夏みかん  2007-12-08 08:53:25  No: 67139  IP: 192.*.*.*

> 夏みかんさんがおっしゃったとおり、WinMainの第一引数のインスタンスを
> LoadImageに指定することで解決しました!!
解決したようですが GetWindowLong( hWnd, GWL_HINSTANCE ); で NULL が
返されるのは不思議です。ウインドウハンドルも正しくないのか?

子ウインドウなどで処理している場合は親ウインドウのハンドルを渡します。
GetWindowLong( GetParent(hChildWnd), GWL_HINSTANCE );
とします。

WinMain の第一引数で解決したので細かいことはいいのかな。

編集 削除
バンビー  2007-12-08 10:49:30  No: 67140  IP: 192.*.*.*

お返事ありがとうございます。
親ウィンドウで処理しているのでhWndでいいんですが、なぜかNULLです;;

疑問点があるにせよ成功してよかったです。後々影響がでないといいのですが。。。

編集 削除
シャノン  2007-12-10 01:08:12  No: 67141  IP: 192.*.*.*

CreateWindow(Ex)のHINSTANCE引数に何を渡していますか?
GetWindowLongは、そこに渡した物を取得するはずです。

> それから LR_DEFAULTCOLOR 定数は付けないほうが良いでしょう。
> 付けなければリソースのアイコンのサイズが使われるため、16、32 を指定しなくても良いよ。

それは LR_DEFAULTSIZE のことでは?

編集 削除