○タスクトレイにアイコンを作成
初めにリソースにアイコンを追加しておかないと枠だけしか表示されません。
アイコンの追加方法
アイコンを IDI_ICON1 として追加しました。
下の部品をヘッダーの下あたりの適当なところに貼り付けます。
#include <windows.h>
#define WM_USER_MSG (WM_USER+100) //自作メッセージ
namespace NTFYICON{
NOTIFYICONDATA m_stNtfyIcon;
//タスクトレイにアイコンを作成
void setNtfiIcon(HWND hWnd,char*str){
m_stNtfyIcon.cbSize = sizeof( NOTIFYICONDATA );
m_stNtfyIcon.uID = 0;
m_stNtfyIcon.hWnd = hWnd;
m_stNtfyIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
m_stNtfyIcon.hIcon = (HICON)SendMessage(hWnd, WM_GETICON, ICON_SMALL, 0);
m_stNtfyIcon.uCallbackMessage = WM_USER_MSG;
lstrcpy( m_stNtfyIcon.szTip,str);
Shell_NotifyIcon( NIM_ADD, &m_stNtfyIcon );
}
//タスクトレイのアイコンを削除
void eraseNtfiIcon(){
Shell_NotifyIcon( NIM_DELETE, &m_stNtfyIcon );
}
}
メッセージを処理するところを以下のように変更します。
//ダイアログプロシージャー
BOOL CALLBACK DlgProc1(HWND hDlg,UINT msg,WPARAM wp,LPARAM lp){
switch (msg){
case WM_SHOWWINDOW:
{
//リソースからアイコンを取得
//LoadIcon(NULL, IDI_WINLOGO) システムのアイコンを使用する場合はこのようにする
HICON hIcon=LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
//アイコンの設定
SendMessage(hDlg, WM_SETICON,NULL,(LPARAM)hIcon);
//タスクトレイにアイコンを生成 表示される文字:test
NTFYICON::setNtfiIcon(hDlg,"test");
}
break;
case WM_USER_MSG://タスクトレイのアイコンのメッセージ
switch(lp)
{
case WM_LBUTTONDOWN:
MessageBox(NULL,"タスクトレイアイコンの左クリック","",0);
break;
case WM_RBUTTONDOWN:
MessageBox(NULL,"タスクトレイアイコンの右クリック","",0);
break;
}
break;
case WM_CLOSE:
NTFYICON::eraseNtfiIcon();//タスクトレイのアイコンを削除
EndDialog(hDlg,WM_CLOSE);
PostQuitMessage(0);
break;
}
return FALSE;
}
このままではhInstが無いというエラーが出ますので、LoadIconで使うインスタンスを事前に保存しておく必要があります。
スコープの一番大きな所で変数宣言をします。
HINSTANCE hInst;
最初に実行されるWinMain関数で保存しておきます。
int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,
LPSTR lpsCmdLine,int nCmdShow ){
hInst=hCurInst;
以上でタスクトレイにアイコンが表示されて、アイコンをクリックするとメッセージボックスが表示されます。
もしインスタンスハンドルを保存するのが面倒な方はその場で取得する方法もあります。
LoadIcon((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE) , MAKEINTRESOURCE(IDI_ICON1))
■タスクトレイのアイコンをクリックするとメニュー表示
メニュー表示といっても別に凄いことするのじゃなくてタスクトレイアイコンのクリックメッセージを受け取ったら現在のマウスの座標にメニューを表示するだけの事です。
▼まずはメニューリソースの作成
リソースの所で挿入を選択します
リソースの種類でMenuを新規作成
空っぽのメニューに対してダブルクリックして適当なキャプションの文字を設定
同じようにメニューの項目を作成していきます。
▼メニューの表示
リソース作成が終わったら、プロシージャを変更してアイコンがクリックされたらマウス座標に対してメニューを表示します。
そのままのマウスの座標に表示してるだけです。
case WM_USER_MSG: //タスクトレイのアイコンのメッセージ
switch(lp)
{
case WM_RBUTTONDOWN:
//タスクトレイアイコンの右クリック
{
POINT pt;
GetCursorPos(&pt);
HMENU menu=LoadMenu((HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE),MAKEINTRESOURCE(IDR_MENU1));
SetForegroundWindow(hDlg);
TrackPopupMenu(GetSubMenu(menu,0),TPM_LEFTALIGN,/* X */pt.x,/* Y */pt.y,NULL,hDlg,NULL);
DestroyMenu(menu);
}
break;
case WM_LBUTTONDOWN:
//タスクトレイアイコンの左クリック
break;
}
まず最初に、WM_USER_MSG:を拾ってから、その後に右クリックか左クリックかを分岐しています。
赤文字部分のSetForegroundWindow(hDlg)にてウィンドウを最前面に移動しておかないとポップアップしたメニューが消えません。
▼メニューの選択に対する動作
普通のボタンと同じように来ますので、メニューの各々の項目のリソースのIDを調べてプロシージャに追加するとメッセージを拾えます。
case WM_COMMAND:
switch (LOWORD(wp)){
case ID_MENUITEM40001:
printf("ID_MENUITEM40001\n");
break;
case ID_MENUITEM40002:
printf("ID_MENUITEM40002\n");
break;
}
break;
これにより、タスクトレイにアイコンを入れて、右クリックでメニューが表示され必要な処理が実行できます。
以上で動きますが、ソフトを作成するには、
起動時にウィンドウを表示しない を見た方がいいかもしれません、サンプルのコードがタスクトレイのソフトの参考になると思います。
▲トップページ
>
Windows と C++