○タスクトレイにアイコンを作成

#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:
//			SendMessage(hDlg, WM_SETICON,NULL,(LPARAM)LoadIcon(NULL, IDI_WINLOGO));//ダイアログにアイコンを付ける
//			NTFYICON::setNtfiIcon(hDlg,"test");//タスクトレイにアイコンを生成 表示される文字: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;
//}
//

■タスクトレイのアイコンをクリックするとメニュー表示

メニュー表示といっても別に凄いことするのじゃなくてタスクトレイアイコンのクリックメッセージを受け取ったら現在のマウスの座標にメニューを表示するだけの事です。

▼まずはメニューリソースの作成
リソースの所で挿入を選択します




リソースの種類でMenuを新規作成




空っぽのメニューに対してダブルクリックして適当なキャプションの文字を設定




同じようにメニューの項目を作成していきます。





▼メニューの表示

リソース作成が終わったら、プロシージャを変更してアイコンがクリックされたらマウス座標にたいしてメニューを表示します。
まんま、マウスの座標に表示してるだけですw
case WM_USER_MSG://タスクトレイのアイコンのメッセージ
	switch(lp)
	{
	case WM_RBUTTONDOWN:
		{
		POINT pt;
		GetCursorPos(&pt);
		HMENU menu=LoadMenu((HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE),MAKEINTRESOURCE(IDR_MENU1));
		TrackPopupMenu(GetSubMenu(menu,0),TPM_LEFTALIGN,/* X */pt.x,/* Y */pt.y,NULL,hDlg,NULL);
		DestroyMenu(menu);
		}
		break;


▼メニューの選択に対する動作

普通のボタンと同じように来ますので、メニューの各々の項目のリソースのIDを調べてプロシージャに追加するだけです
case WM_COMMAND:
	switch (LOWORD(wp)){
		case ID_MENUITEM40003:
			printf("ID_MENUITEM40003\n");
			break;
		case ID_MENUITEM40004:
			printf("ID_MENUITEM40004\n");
			break;
	}
	break;

以上で動きますが、ひょっとしたら 起動時にウィンドウを表示しないも必要かもしれません


▲トップページ > Windows と C++