// TaskNotificationAreaItem.cpp // // This object manages one task notification area item. It allows // for multiple icons that can be switched easily creating animations. // // Revision Log // // Date Who SAR Notes // ========== === ======= ===================================== // 2001-10-12 mph Initial coding by Mark Henri of // MPH Software - markhenri@attbi.com // #include #include "TaskNotificationAreaItem.h" #include "icon.h" #include "WinException.h" CTaskNotificationAreaItem::CTaskNotificationAreaItem() : _hwnd(NULL) { } CTaskNotificationAreaItem::~CTaskNotificationAreaItem() { if (_icons.size() < 1) return; for (ICONS::iterator i=_icons.begin(); i != _icons.end(); i++) { rfc::SmallIcon* si = *i; delete si; } _icons.erase(_icons.begin(), _icons.end()); } BOOL CTaskNotificationAreaItem::LoadIcon(HINSTANCE i, int iconResId) { try { rfc::SmallIcon* s = new rfc::SmallIcon(i, iconResId); _icons.push_back(s); return TRUE; } catch (WinException e) { return FALSE; } } BOOL CTaskNotificationAreaItem::Add(HWND hwnd, int i, LPSTR lpszTip, UINT a_uCallbackMessageValue) { _hwnd = hwnd; // must load the icons before calling this method if (i < 0 || i >= _icons.size()) return FALSE; rfc::SmallIcon* si = _icons[i]; return Add(hwnd, 1, *si, lpszTip, a_uCallbackMessageValue); } BOOL CTaskNotificationAreaItem::Add(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip, UINT a_uCallbackMessageValue) { _hwnd = hwnd; BOOL res; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = 1; tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnid.uCallbackMessage = a_uCallbackMessageValue; tnid.hIcon = hicon; if (lpszTip) lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip)); else tnid.szTip[0] = '\0'; res = Shell_NotifyIcon(NIM_ADD, &tnid); return res; } BOOL CTaskNotificationAreaItem::Delete() { BOOL res; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = _hwnd; tnid.uID = 1; res = Shell_NotifyIcon(NIM_DELETE, &tnid); return res; } BOOL CTaskNotificationAreaItem::ChooseIcon(int i) { if (i < 0 || i >= _icons.size()) return FALSE; rfc::SmallIcon* si = _icons[i]; ModifyIcon(*si); return TRUE; } BOOL CTaskNotificationAreaItem::NextIcon() { static int lastIndex = 0; // start at the first one loaded lastIndex++; if (lastIndex >= _icons.size()) lastIndex = 0; return ChooseIcon(lastIndex); } BOOL CTaskNotificationAreaItem::ModifyIcon(HICON hicon) { BOOL res; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = _hwnd; tnid.uID = 1; // always 1 because this object only manages one icon tnid.uFlags = NIF_ICON; tnid.hIcon = hicon; tnid.szTip[0] = '\0'; res = Shell_NotifyIcon(NIM_MODIFY, &tnid); return res; }