2015年2月18日水曜日

バルーンチップを表示するプログラム


 タスクトレイにアイコンを置き、バルーンチップを表示するプログラムサンプル。
WM_CREATEでトレイアイコンを設置。
ボタンを押すとトレイアイコンの位置にバルーンチップを表示します。
参考になれば幸い。

#define _WIN32_WINNT 0x501
#include <windows.h>

#define CLASS_NAME  TEXT("BalloonTest") 
#define WINDOW_TITLE TEXT("BalloonTest")
#define BUTTON_TITLE TEXT("Balloon")
#define IDC_BTN_BALLOON 1
#define TASKTRAY_ID  2
#define WM_TASKTRAY    (WM_APP+1)





void balloon( HWND hWnd )
{
 if ( hWnd )
 {
  NOTIFYICONDATA notifyIcon = {0};
  notifyIcon.cbSize = sizeof(notifyIcon);
  notifyIcon.hWnd = hWnd;
  notifyIcon.uID = TASKTRAY_ID;
  notifyIcon.uFlags = NIF_INFO;
  notifyIcon.dwInfoFlags = NIIF_ERROR;

  lstrcpy( notifyIcon.szInfoTitle, TEXT("バルーンタイトル") );
  lstrcpy( notifyIcon.szInfo, TEXT("バルーン文字") );
  
  Shell_NotifyIcon( NIM_MODIFY, ¬ifyIcon );
 }
}



void putTrayIcon( HWND hWnd )
{
 // タスクトレイアイコン追加
 NOTIFYICONDATA notifyIcon = {0};
 notifyIcon.cbSize = sizeof(notifyIcon);
 notifyIcon.uID = TASKTRAY_ID;
 notifyIcon.hWnd = hWnd;
 notifyIcon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
 notifyIcon.uCallbackMessage = WM_TASKTRAY;
 notifyIcon.hIcon = LoadIcon( NULL, IDI_APPLICATION );
 lstrcpy( notifyIcon.szTip, WINDOW_TITLE );
 Shell_NotifyIcon( NIM_ADD, ¬ifyIcon );
}



void removeTrayIcon( HWND hWnd )
{
 NOTIFYICONDATA notifyIcon = {0};
 notifyIcon.cbSize = sizeof(notifyIcon);
 notifyIcon.hWnd = hWnd;
 notifyIcon.uID = TASKTRAY_ID;
 Shell_NotifyIcon( NIM_DELETE, ¬ifyIcon );
}




LRESULT CALLBACK wndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp )
{
 static UINT uiTaskbarRestart = WM_NULL;
 switch ( msg )
 {
 case WM_CREATE:
  putTrayIcon( hWnd );
  uiTaskbarRestart = RegisterWindowMessage( TEXT("TaskbarCreated") );
  break;
 case WM_CLOSE:
  removeTrayIcon( hWnd );
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_COMMAND:
  switch( LOWORD(wp) )
  {
  case IDC_BTN_BALLOON:
   balloon( hWnd );
   break;
  }
  return 0;
 case WM_TASKTRAY:
  switch ( lp )
  {
  case WM_LBUTTONDOWN:
   MessageBox( hWnd, TEXT("タスクトレイクリック"), WINDOW_TITLE, MB_OK );
   return 0;
  case NIN_BALLOONUSERCLICK:
   MessageBox( hWnd, TEXT("バルーンクリック"), WINDOW_TITLE, MB_OK );
   return 0;
  }
  break;
 }

 // タスクバー再起動時のアイコン再設定処理
 if ( msg == uiTaskbarRestart )
 {
  removeTrayIcon( hWnd );
  putTrayIcon( hWnd );
 }

 return DefWindowProc( hWnd , msg , wp , lp );
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow )
{

 WNDCLASS winc = {0};
 winc.style  = CS_HREDRAW | CS_VREDRAW;
 winc.lpfnWndProc = wndProc;
 winc.cbClsExtra = 0;
 winc.cbWndExtra = 0;
 winc.hInstance  = hInstance;
 winc.hIcon   = LoadIcon(NULL , IDI_APPLICATION);
 winc.hCursor  = LoadCursor(NULL , IDC_ARROW);
 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 winc.lpszMenuName = NULL;
 winc.lpszClassName = CLASS_NAME;

 if ( !RegisterClass(&winc) ) return 0;

 HWND hWnd = CreateWindow(
   CLASS_NAME, WINDOW_TITLE,
   WS_OVERLAPPEDWINDOW | WS_VISIBLE,
   CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, NULL, NULL,
   hInstance, NULL );
 if ( hWnd == NULL ) return 0;


 
 CreateWindow(
  TEXT("BUTTON"), BUTTON_TITLE,
  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  10, 10, 300, 100, hWnd, reinterpret_cast(IDC_BTN_BALLOON), hInstance, NULL );


 MSG msg;
 while ( GetMessage(&msg, NULL, 0, 0) )
 {
  DispatchMessage(&msg);
 }
 

 return msg.wParam;
}

 ちなみに、dwInfoFlags にNIIF_ERRORを指定するとバルーンのアイコンがこうなります。


 NIIF_NONEだとアイコンなしに。




 2015-03-19
uiTaskbarRestart の初期値を WM_NULL に変更。存在を忘れてた。

0 件のコメント: