187 lines
4.2 KiB
C++
187 lines
4.2 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
Tray.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Implements systray functionality
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
Unicode only
|
||
|
|
||
|
History:
|
||
|
|
||
|
05/04/2001 rparsons Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Adds the specified icon to the system tray
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hWnd - Parent window handle
|
||
|
hIcon - Icon hanle to add to the tray
|
||
|
lpwTip - Tooltip to associate with the icon
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success, FALSE otherwise
|
||
|
|
||
|
--*/
|
||
|
BOOL
|
||
|
AddIconToTray(
|
||
|
IN HWND hWnd,
|
||
|
IN HICON hIcon,
|
||
|
IN LPCWSTR lpwTip
|
||
|
)
|
||
|
{
|
||
|
NOTIFYICONDATA pnid;
|
||
|
BOOL fReturn = FALSE;
|
||
|
|
||
|
pnid.cbSize = sizeof(NOTIFYICONDATA);
|
||
|
pnid.hWnd = hWnd;
|
||
|
pnid.uID = ICON_NOTIFY;
|
||
|
pnid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
||
|
pnid.uCallbackMessage = WM_NOTIFYICON;
|
||
|
pnid.hIcon = hIcon;
|
||
|
|
||
|
if (lpwTip) {
|
||
|
wcsncpy(pnid.szTip, lpwTip, wcslen(lpwTip)*sizeof(WCHAR));
|
||
|
} else {
|
||
|
pnid.szTip[0] = '\0';
|
||
|
}
|
||
|
|
||
|
fReturn = Shell_NotifyIcon(NIM_ADD, &pnid);
|
||
|
|
||
|
if (hIcon) {
|
||
|
DestroyIcon(hIcon);
|
||
|
}
|
||
|
|
||
|
return (fReturn ? TRUE : FALSE);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Removes the specified icon from the system tray
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hWnd - Parent window handle
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success, FALSE otherwise
|
||
|
|
||
|
--*/
|
||
|
BOOL
|
||
|
RemoveFromTray(
|
||
|
IN HWND hWnd
|
||
|
)
|
||
|
{
|
||
|
NOTIFYICONDATA pnid;
|
||
|
BOOL fReturn = FALSE;
|
||
|
|
||
|
pnid.cbSize = sizeof(NOTIFYICONDATA);
|
||
|
pnid.hWnd = hWnd;
|
||
|
pnid.uID = ICON_NOTIFY;
|
||
|
|
||
|
fReturn = Shell_NotifyIcon(NIM_DELETE, &pnid);
|
||
|
|
||
|
return (fReturn);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Displays a popup menu for the tray icon.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hWnd - Main window handle
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success, FALSE otherwise.
|
||
|
|
||
|
--*/
|
||
|
BOOL
|
||
|
DisplayMenu(
|
||
|
IN HWND hWnd
|
||
|
)
|
||
|
{
|
||
|
MENUITEMINFO mii;
|
||
|
HMENU hMenu = NULL, hPopupMenu = NULL;
|
||
|
POINT pt;
|
||
|
BOOL fReturn = FALSE;
|
||
|
|
||
|
hMenu = CreatePopupMenu();
|
||
|
|
||
|
if (hMenu) {
|
||
|
|
||
|
mii.cbSize = sizeof(MENUITEMINFO);
|
||
|
mii.fMask = MIIM_DATA | MIIM_ID | MIIM_TYPE | MIIM_STATE;
|
||
|
mii.fType = MFT_STRING;
|
||
|
mii.wID = IDM_RESTORE;
|
||
|
mii.hSubMenu = NULL;
|
||
|
mii.hbmpChecked = NULL;
|
||
|
mii.hbmpUnchecked = NULL;
|
||
|
mii.dwItemData = 0L;
|
||
|
mii.dwTypeData = L"&Restore";
|
||
|
mii.cch = 14;
|
||
|
mii.fState = MFS_ENABLED;
|
||
|
|
||
|
InsertMenuItem(hMenu, 0, TRUE, &mii);
|
||
|
|
||
|
mii.cbSize = sizeof(MENUITEMINFO);
|
||
|
mii.fMask = MIIM_TYPE;
|
||
|
mii.fType = MFT_SEPARATOR;
|
||
|
mii.hSubMenu = NULL;
|
||
|
mii.hbmpChecked = NULL;
|
||
|
mii.hbmpUnchecked = NULL;
|
||
|
mii.dwItemData = 0L;
|
||
|
|
||
|
InsertMenuItem(hMenu, 1, TRUE, &mii);
|
||
|
|
||
|
mii.cbSize = sizeof(MENUITEMINFO);
|
||
|
mii.fMask = MIIM_DATA | MIIM_ID | MIIM_TYPE | MIIM_STATE;
|
||
|
mii.fType = MFT_STRING;
|
||
|
mii.wID = IDM_EXIT;
|
||
|
mii.hSubMenu = NULL;
|
||
|
mii.hbmpChecked = NULL;
|
||
|
mii.hbmpUnchecked = NULL;
|
||
|
mii.dwItemData = 0L;
|
||
|
mii.dwTypeData = L"E&xit";
|
||
|
mii.cch = 10;
|
||
|
mii.fState = MFS_ENABLED;
|
||
|
|
||
|
InsertMenuItem(hMenu, 2, TRUE, &mii);
|
||
|
|
||
|
// Get the coordinates of the cursor
|
||
|
GetCursorPos(&pt);
|
||
|
|
||
|
// Show the popup menu - the menu is left aligned and
|
||
|
// we're tracking the left button or right button
|
||
|
fReturn = TrackPopupMenuEx(hMenu, TPM_CENTERALIGN | TPM_RIGHTBUTTON,
|
||
|
pt.x, pt.y, hWnd, NULL);
|
||
|
}
|
||
|
|
||
|
if (hMenu) {
|
||
|
DestroyMenu(hMenu);
|
||
|
}
|
||
|
|
||
|
return (fReturn);
|
||
|
}
|