タスクトレイにアイコンを表示したいのですが、うまく表示できません。
環境は 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);
hIcon = ::LoadImage(NULL, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
を使ってもだめでしょうか?
'HANDLE' から 'HICON' に変換できません。とエラーがでます。
hIcon=(HICON)(NULL,MAKEINTRESOURCE(IDI_ICON4),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
にするとビルドできるのですが、アイコンが表示されないままです;;
アイコンのサイズが32×32なので第3、4引数を32に変えても無理でした;;
hIcon = LoadIcon(NULL, "IDI_ICON1");
ではどうでしょうか?
.cppで
#define IDI_ICON1 133
しているだけ…ですか?
.rcにも
#define IDI_ICON1 133
は適用されていますか??
>hIcon = LoadIcon(NULL, "IDI_ICON1");
変わりません;;
.cppというよりResouse.hに書いておりインクルードしています。
#define IDI_ICON1 133
.rcには
IDI_ICON1 ICON "icon1.ico"
だけですがインクルードしているので問題ないのでは。
shellapi.hをインクルードしなければShell_NotifyIconやNOTIFYICONDATAが
使えないのはなにか関係していますでしょうか。
> 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 が返っているかも。
要するに期待通りに動作しないときは、全ての戻り値のエラーチェックをしましょう。
お返事ありがとうございます。
>これでもアイコンが表示しない場合は、GetWindowLong、LoadImage の戻り値を調べて下さい。
しらべてみるとGetWindowLong、LoadImage どちらもNULLが返っていました。
アイコンの登録はできていると思うのですが、なにかおかしいところはあるでしょうか。
夏みかんさんがおっしゃったとおり、WinMainの第一引数のインスタンスを
LoadImageに指定することで解決しました!!
ゴンさん、瀬戸っぷさん、夏みかんさん ほんとにありがとうございました!!
> 夏みかんさんがおっしゃったとおり、WinMainの第一引数のインスタンスを
> LoadImageに指定することで解決しました!!
解決したようですが GetWindowLong( hWnd, GWL_HINSTANCE ); で NULL が
返されるのは不思議です。ウインドウハンドルも正しくないのか?
子ウインドウなどで処理している場合は親ウインドウのハンドルを渡します。
GetWindowLong( GetParent(hChildWnd), GWL_HINSTANCE );
とします。
WinMain の第一引数で解決したので細かいことはいいのかな。
お返事ありがとうございます。
親ウィンドウで処理しているのでhWndでいいんですが、なぜかNULLです;;
疑問点があるにせよ成功してよかったです。後々影響がでないといいのですが。。。
CreateWindow(Ex)のHINSTANCE引数に何を渡していますか?
GetWindowLongは、そこに渡した物を取得するはずです。
> それから LR_DEFAULTCOLOR 定数は付けないほうが良いでしょう。
> 付けなければリソースのアイコンのサイズが使われるため、16、32 を指定しなくても良いよ。
それは LR_DEFAULTSIZE のことでは?