
>>>       Best viewed in Notepad with Wordwrap set       <<<

This is a simple MFC SDI that creates & displays two system tray icons, illustrates how to programmatically differentiate between them & also how to invoke a pop-up menu on right clicking an icon.

Besides, it also elucidates useful tricks like :

* How to ensure an app runs on Windows 95 & above.

* Using a Named Mutex to ensure a single instance of the application is running.

* Using CreateProcess to spawn notepad with a text file.


OK, lets start off :

The importants things to remember are -

1. We use a NOTIFYICONDATA struct. This is initialized with the desired icon & corresponding attributes.
2. The shell is notified of our icons with the Shell_NotifyIcon API call. 

The tray icons are objects of the core class CTrayIcon, this is simply a wrapper over the NOTIFYICONDATA struct with a few useful methods.
It creates the icons, contains state information & also handles notifications.

The CTrayIcon::Create method initializes the NOTIFYICONDATA struct with desired behaviour & informs the shell through Shell_NotifyIcon. We also pass the callback message id, the handler of which fields notifications for the tray icons. 

We need just two methods to gain an understanding into using the CTrayIcon class. 

-OnLButtonDown() 
 Creates the system tray objects and loads & assigns icons to them. 

-OnTrayNotify()
 Handles notifications from the systray objects & redirects them to the appropriate systray object. 
 OnTrayNotify() is manually added by declaring a CSystemTrayIconView message map entry :

ON_MESSAGE(WM_ICON_NOTIFY, CSystemTrayIconView::OnTrayNotify)

where WM_ICON_NOTIFY is defined in stdafx.h :

#define WM_ICON_NOTIFY		(WM_USER + WM_APP + 10)

and thats it ! We're set to roll !!!

Credits -
Thanks to Alexander Federov ! I learnt about system tray icons from his AlexF dialer project on sourceforge.net of which I am (i think) a member. ( yea, i've still gotta optimize the dialers data rate counter :-( ) 
Must also mention Richard from WebPercept.com, I made the initial SystemTrayIcon proj to help him understand tray icons & then polished it for my site.

I wish you Peace & Success.

lioneljlobo@hotmail.com
http://www.geocities.com/lioneljlobo/


(Below is the standard yadda yadda generated by AppWizard, which no doubt, you've read before.) 

========================================================================
       MICROSOFT FOUNDATION CLASS LIBRARY : SystemTrayIcon
========================================================================


AppWizard has created this SystemTrayIcon application for you.  This application
not only demonstrates the basics of using the Microsoft Foundation classes
but is also a starting point for writing your application.

This file contains a summary of what you will find in each of the files that
make up your SystemTrayIcon application.

SystemTrayIcon.dsp
    This file (the project file) contains information at the project level and
    is used to build a single project or subproject. Other users can share the
    project (.dsp) file, but they should export the makefiles locally.

SystemTrayIcon.h
    This is the main header file for the application.  It includes other
    project specific headers (including Resource.h) and declares the
    CSystemTrayIconApp application class.

SystemTrayIcon.cpp
    This is the main application source file that contains the application
    class CSystemTrayIconApp.

SystemTrayIcon.rc
    This is a listing of all of the Microsoft Windows resources that the
    program uses.  It includes the icons, bitmaps, and cursors that are stored
    in the RES subdirectory.  This file can be directly edited in Microsoft
	Visual C++.

SystemTrayIcon.clw
    This file contains information used by ClassWizard to edit existing
    classes or add new classes.  ClassWizard also uses this file to store
    information needed to create and edit message maps and dialog data
    maps and to create prototype member functions.

res\SystemTrayIcon.ico
    This is an icon file, which is used as the application's icon.  This
    icon is included by the main resource file SystemTrayIcon.rc.

res\SystemTrayIcon.rc2
    This file contains resources that are not edited by Microsoft 
	Visual C++.  You should place all resources not editable by
	the resource editor in this file.



/////////////////////////////////////////////////////////////////////////////

For the main frame window:

MainFrm.h, MainFrm.cpp
    These files contain the frame class CMainFrame, which is derived from
    CFrameWnd and controls all SDI frame features.

res\Toolbar.bmp
    This bitmap file is used to create tiled images for the toolbar.
    The initial toolbar and status bar are constructed in the CMainFrame
    class. Edit this toolbar bitmap using the resource editor, and
    update the IDR_MAINFRAME TOOLBAR array in SystemTrayIcon.rc to add
    toolbar buttons.
/////////////////////////////////////////////////////////////////////////////

AppWizard creates one document type and one view:

SystemTrayIconDoc.h, SystemTrayIconDoc.cpp - the document
    These files contain your CSystemTrayIconDoc class.  Edit these files to
    add your special document data and to implement file saving and loading
    (via CSystemTrayIconDoc::Serialize).

SystemTrayIconView.h, SystemTrayIconView.cpp - the view of the document
    These files contain your CSystemTrayIconView class.
    CSystemTrayIconView objects are used to view CSystemTrayIconDoc objects.



/////////////////////////////////////////////////////////////////////////////
Other standard files:

StdAfx.h, StdAfx.cpp
    These files are used to build a precompiled header (PCH) file
    named SystemTrayIcon.pch and a precompiled types file named StdAfx.obj.

Resource.h
    This is the standard header file, which defines new resource IDs.
    Microsoft Visual C++ reads and updates this file.

/////////////////////////////////////////////////////////////////////////////
Other notes:

AppWizard uses "TODO:" to indicate parts of the source code you
should add to or customize.

If your application uses MFC in a shared DLL, and your application is 
in a language other than the operating system's current language, you
will need to copy the corresponding localized resources MFC42XXX.DLL
from the Microsoft Visual C++ CD-ROM onto the system or system32 directory,
and rename it to be MFCLOC.DLL.  ("XXX" stands for the language abbreviation.
For example, MFC42DEU.DLL contains resources translated to German.)  If you
don't do this, some of the UI elements of your application will remain in the
language of the operating system.

/////////////////////////////////////////////////////////////////////////////
