(转)Creating a GTK notification area icon using Mono and C#

转载自:http://www.dijksterhuis.org/creating-gtk-notification-area-icon-mono/

Cool (Linux) applications have their own icon in the notification area. To add my own icon in the Gnome notification area using Mono only took a few lines of code. In the post below I show how you can add your icon and associate a tooltip and right click menu to it.

 

GTK provides the StatusIcon class to register your own icon in the notification area.

StatusIcon  myStatusIcon;

You can provide and load your own icon, but for this example I used one of the GTK stock icons.

myStatusIcon = StatusIcon.NewFromStock(Stock.Harddisk); // I use a stock icon from Stock.*
// to avoid having to include an icon file
myStatusIcon.Visible = true; // Make sure we are displayed

Adding or changing a tooltip is as straighforward as assigning it:

// The message to show when the mouse hovers over the icon
myStatusIcon.Tooltip = "Hello World ToolTip";

To create a rightclick menu we need to register the PopupMenu event handler:

myStatusIcon.PopupMenu += OnStatusIconPopupMenu; // Link in the right click popup menu
/*
The Status Popup menu is shown when the user right clicks on the toolbar icon */

protected void OnStatusIconPopupMenu(object sender, EventArgs e)
{
Menu popupMenu
= new Menu();

MenuItem helloItem
= new MenuItem("About Hello World");
helloItem.Show();
helloItem.Activated
+= new EventHandler(OnHelloAboutActivated);

popupMenu.Append(helloItem);
popupMenu.Popup(
null,null,null,3,Gtk.Global.CurrentEventTime);
}

And that is really all there is to it. I have included the complete code below. If you create a new GTK solution in MonoDevelop you will end up with two files, Main.cs and MainWindows.Cs. Replace the MainWindow.CS file with the content below:

using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{
StatusIcon myStatusIcon;
AboutDialog aboutDialog;

public MainWindow (): base (Gtk.WindowType.Toplevel)
{

/* The following lines create the notification area status icon */
/* Make it visible and link in the right click popup menu */

myStatusIcon
= StatusIcon.NewFromStock(Stock.Harddisk); // I use a stock icon from Stock.*
// to avoid having to include an icon file
myStatusIcon.Tooltip = "Hello World ToolTip"; // The message to show when the mouse hovers over the icon
myStatusIcon.Visible = true; // Make sure we are displayed
myStatusIcon.PopupMenu += OnStatusIconPopupMenu; // Link in the right click popup menu

/* Not necessary */
Label AppWindowLabel
= new Label("Hello World");
this.Add(AppWindowLabel);

Build ();
}

/* Called when the main application closes */

protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal
= true;
}

/* The Status Popup menu is shown when the user right clicks on the toolbar icon */

protected void OnStatusIconPopupMenu(object sender, EventArgs e)
{
Menu popupMenu
= new Menu();

MenuItem helloItem
= new MenuItem("About Hello World");
helloItem.Show();
helloItem.Activated
+= new EventHandler(OnHelloAboutActivated);

popupMenu.Append(helloItem);
popupMenu.Popup(
null,null,null,3,Gtk.Global.CurrentEventTime);
}

/* If the user select the "About Hello World" menu option, we show the about dialog */

protected void OnHelloAboutActivated(object sender, EventArgs e)
{
aboutDialog
= new AboutDialog();

aboutDialog.ProgramName
= "The About Dialog Popup Demo";
aboutDialog.Version
= "1.0beta";
aboutDialog.Comments
= "The best things in life are simple!";
aboutDialog.License
= "Creative Commons";
aboutDialog.Authors
= new string[] { "Martijn Dijksterhuis" };
aboutDialog.Website
= "http://www.dijksterhuis.org";
aboutDialog.Response
+= new ResponseHandler(OnHelloAboutClose);

aboutDialog.Run();
}

/* Catch the "Close" and "X" button event from the about dialog box */

protected void OnHelloAboutClose(object sender, ResponseArgs e)
{
if (e.ResponseId==ResponseType.Cancel || e.ResponseId==ResponseType.DeleteEvent)
aboutDialog.Destroy();
}

}

posted @ 2011-02-25 13:30  逍客1  阅读(640)  评论(0编辑  收藏  举报