SystemTrayIconComponent详解

系统托盘图标代表正在运行的程序,出现在Windows和Linux状态栏的最右侧,类似于QQ、迅雷那种程序图标。使用JUCE类库,这项技术两个步骤即可搞定。

  1. 写一个托盘图标类,继承自SystemTrayIconComponent类。
  2. 窗口框架类中声明、创建之。

写类

// 仅Windows系统和Linux系统支持系统托盘图标,因此使用了#if宏。其他系统下不编译本类
#if JUCE_WINDOWS || JUCE_LINUX

// 托盘图标类继承自SystemTrayIconComponent类
class DemoTaskbarComponent  : public SystemTrayIconComponent 
{
public:
    DemoTaskbarComponent()  
    {
        // 构造函数中创建一个图像(本例为文字类图像,白色背景中一个黑色的M)
        Image icon (Image::RGB, 32, 32, true);
        Graphics g (icon);
        g.fillAll (Colours::white.withAlpha (0.90f));
        g.setColour (Colours::black);
        g.setFont ((float) icon.getHeight(), Font::bold);
        g.drawText ("M", 0, 0, icon.getWidth(), icon.getHeight(),
                    Justification::centred, false);
        setIconImage (icon); // 设置托盘图标所用的图像

        // 鼠标指向时显示提示信息
        setIconTooltip (L"系统托盘图标,单击弹出菜单.");
}

// 鼠标按下,本例为弹出菜单
void mouseDown (const MouseEvent&)  
{
    PopupMenu m;    
    m.addItem (1, L"关于");
    m.addItem (2, L"退出");

    const int result = m.show();

    switch (result) 
    {
        case 1:
            AlertWindow::showMessageBox(AlertWindow::InfoIcon, "Title", "Text");
            break;
        case 2:
            JUCEApplication::getInstance()->systemRequestedQuit();
            break;
        default:
            break;
        }            
    }
};

#endif	// 编译条件宏结束

窗口框架类声明并创建托盘图标对象

ScopedPointer<Component> taskbarIcon;

#if JUCE_WINDOWS || JUCE_LINUX
    taskbarIcon = new DemoTaskbarComponent();
#endif