Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

187 lines
4.2 KiB

/*++
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);
}