Skip to content

Иконка в трее (tray_icon)

Класс tray_icon добавляет иконку приложения в системный трей (область уведомлений).

Быстрый старт

#include <wui/control/tray_icon.hpp>

// Из файла
auto tray = std::make_shared<wui::tray_icon>(
    window,
    "res/icon.png",
    "My Application",
    [](wui::tray_icon_action action) {
        switch (action) {
            case wui::tray_icon_action::left_click:
                show_window();
                break;
            case wui::tray_icon_action::right_click:
                show_context_menu();
                break;
            default:
                break;
        }
    }
);

Типы действий

enum class tray_icon_action
{
    left_click,    // Левый клик
    right_click,   // Правый клик
    center_click,  // Средний клик
    message_click  // Клик по сообщению
};

API

Конструкторы

// Из ресурса (Windows)
#ifdef _WIN32
tray_icon(std::weak_ptr<window> parent, 
          int32_t icon_resource_index, 
          std::string_view tip, 
          std::function<void(tray_icon_action)> click_callback);
#endif

// Из файла
tray_icon(std::weak_ptr<window> parent, 
          std::string_view icon_file_name, 
          std::string_view tip, 
          std::function<void(tray_icon_action)> click_callback);

Параметры: - parent — родительское окно - icon_resource_index — ID ресурса иконки (Windows) - icon_file_name — путь к файлу иконки - tip — всплывающая подсказка - click_callback — обработчик кликов

Методы

// Смена иконки
void change_icon(int32_t icon_resource_index);  // Windows
void change_icon(std::string_view icon_file_name);

// Смена подсказки
void change_tip(std::string_view tip);

// Показать уведомление
void show_message(std::string_view title, std::string_view message);

// Установить коллбэк
void set_callback(std::function<void(tray_icon_action)> click_callback);

Примеры

Базовая иконка в трее

auto tray = std::make_shared<wui::tray_icon>(
    window,
#ifdef _WIN32
    IDI_APP_ICON,
#else
    "res/app_icon.png",
#endif
    "My Application - Running",
    [](wui::tray_icon_action action) {
        if (action == wui::tray_icon_action::left_click) {
            show_main_window();
        }
    }
);

Контекстное меню по правому клику

auto tray_menu = std::make_shared<wui::menu>();

wui::menu_items_t items = {
    {1, wui::normal, "Show", "", nullptr, {}, [](int32_t) {
        show_window();
    }},
    {2, wui::normal, "Hide", "", nullptr, {}, [](int32_t) {
        hide_window();
    }},
    {3, wui::separator, "", "", nullptr, {}, nullptr},
    {4, wui::normal, "Exit", "", nullptr, {}, [](int32_t) {
        exit_application();
    }}
};

tray_menu->set_items(items);

auto tray = std::make_shared<wui::tray_icon>(
    window,
    "res/icon.png",
    "My Application",
    [&tray_menu](wui::tray_icon_action action) {
        if (action == wui::tray_icon_action::right_click) {
            tray_menu->show_on_point(get_cursor_position());
        } else if (action == wui::tray_icon_action::left_click) {
            show_window();
        }
    }
);

Уведомления

auto tray = std::make_shared<wui::tray_icon>(
    window,
    "res/icon.png",
    "My Application",
    [](wui::tray_icon_action) {}
);

// Показать уведомление о завершении задачи
void on_task_complete() {
    tray->show_message(
        "Task Complete",
        "Your download has finished."
    );
}

// Показать уведомление об ошибке
void on_error() {
    tray->show_message(
        "Error",
        "Connection failed. Please check your network."
    );
}

Смена иконки в зависимости от состояния

auto tray = std::make_shared<wui::tray_icon>(
    window,
    "res/icon_normal.png",
    "My Application",
    [](wui::tray_icon_action action) {
        if (action == wui::tray_icon_action::left_click) {
            toggle_window();
        }
    }
);

// При изменении состояния
void on_status_changed(bool is_busy) {
    if (is_busy) {
        tray->change_icon("res/icon_busy.png");
        tray->change_tip("My Application - Processing");
    } else {
        tray->change_icon("res/icon_normal.png");
        tray->change_tip("My Application - Idle");
    }
}

Иконка с ресурсом (Windows)

// resource.h
#define IDI_APP_ICON  100
#define IDI_BUSY_ICON 101
#define IDI_ERROR_ICON 102

// В rc-файле
IDI_APP_ICON ICON "res/icon.ico"
IDI_BUSY_ICON ICON "res/busy.ico"
IDI_ERROR_ICON ICON "res/error.ico"

// В коде
#ifdef _WIN32
auto tray = std::make_shared<wui::tray_icon>(
    window,
    IDI_APP_ICON,
    "My Application",
    [](wui::tray_icon_action action) {
        // Обработка кликов
    }
);

// Смена иконки
void set_busy(bool busy) {
    tray->change_icon(busy ? IDI_BUSY_ICON : IDI_APP_ICON);
}
#endif

Минимизация в трей

auto tray = std::make_shared<wui::tray_icon>(
    window,
    "res/icon.png",
    "My Application",
    [](wui::tray_icon_action action) {
        if (action == wui::tray_icon_action::left_click) {
            if (window->is_minimized()) {
                window->restore();
            } else {
                window->show();
            }
        }
    }
);

// При минимизации окна
window->set_minimize_callback([&tray]() {
    window->hide();
    tray->show_message("Minimized", "Application is running in tray");
});

См. также

  • Меню — для контекстного меню
  • Окно — родительское окно