GTK托盘实现


1 程序界面演示图




//trayicon.c

#include <gtk/gtk.h>


static void trayView(GtkMenuItem *item, gpointer user_data);

static void trayExit(GtkMenuItem *item, gpointer user_data);

static void trayIconActivated(GObject *trayIcon, gpointer data);

static void trayIconPopup(GtkStatusIcon *status_icon, guint button,

guint32 activate_time, gpointer popUpMenu);

static void destroy(GtkWidget*, gpointer);

static gboolean delete_event(GtkWidget*, GdkEvent*, gpointer);

static gboolean window_state_event(GtkWidget *widget,

GdkEventWindowState *event, gpointer user_data);


int main(int argc, char *argv[]) {

GtkWidget *menuBar;

GtkWidget *menuItemTopLvl;

GtkWidget *mainMenu;

GtkWidget *mainMenuItemExit;

GtkWidget *menu;

GtkWidget *menuItemView;

GtkWidget *menuItemExit;


gtk_init(&argc, &argv);


GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window), "GtkStatusIcon");

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

gtk_widget_set_size_request(window, 200, -1);


// 加载托盘图标

GtkStatusIcon *trayIcon = gtk_status_icon_new_from_file("chin.ico");


// 为托盘图标设置弹出式菜单

menu = gtk_menu_new();

menuItemView = gtk_menu_item_new_with_label("View");

menuItemExit = gtk_menu_item_new_with_label("Exit");

g_signal_connect(G_OBJECT(menuItemView), "activate", G_CALLBACK(trayView),

window);

g_signal_connect(G_OBJECT(menuItemExit), "activate", G_CALLBACK(trayExit),

NULL);

gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuItemView);

gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuItemExit);

gtk_widget_show_all(menu);


// 设置工具提示

gtk_status_icon_set_tooltip(trayIcon, "MsgWatcherGTK");


// 连接鼠标事件句柄

g_signal_connect(GTK_STATUS_ICON(trayIcon), "activate", GTK_SIGNAL_FUNC(

trayIconActivated), window);

g_signal_connect(GTK_STATUS_ICON(trayIcon), "popup-menu", GTK_SIGNAL_FUNC(

trayIconPopup), menu);

gtk_status_icon_set_visible(trayIcon, FALSE); // 设置图标可视化



menuBar = gtk_menu_bar_new();

menuItemTopLvl = gtk_menu_item_new_with_label("Menu");

gtk_menu_shell_append(GTK_MENU_SHELL(menuBar), menuItemTopLvl);


mainMenu = gtk_menu_new();

gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItemTopLvl), mainMenu);

mainMenuItemExit = gtk_menu_item_new_with_label("Quit");

g_signal_connect(G_OBJECT(mainMenuItemExit), "activate", G_CALLBACK(

trayExit), NULL);

gtk_menu_shell_append(GTK_MENU_SHELL(mainMenu), mainMenuItemExit);


g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);

g_signal_connect(G_OBJECT(window), "delete_event",

G_CALLBACK(delete_event), trayIcon);

g_signal_connect(G_OBJECT(window), "window-state-event", G_CALLBACK(

window_state_event), trayIcon);


gtk_container_add(GTK_CONTAINER(window), menuBar);


gtk_widget_show_all(window);


gtk_main();


return 0;

}


static void trayView(GtkMenuItem *item, gpointer window) {

gtk_widget_show(GTK_WIDGET(window));

gtk_window_deiconify(GTK_WINDOW(window));

}


static void trayExit(GtkMenuItem *item, gpointer user_data) {

printf("exit");

gtk_main_quit();

}


static void trayIconActivated(GObject *trayIcon, gpointer window) {

gtk_widget_show(GTK_WIDGET(window));

gtk_window_deiconify(GTK_WINDOW(window));

}


static void trayIconPopup(GtkStatusIcon *status_icon, guint button,

guint32 activate_time, gpointer popUpMenu) {

gtk_menu_popup(GTK_MENU(popUpMenu), NULL, NULL,

gtk_status_icon_position_menu, status_icon, button, activate_time);

}


static void destroy(GtkWidget *window, gpointer data) {

gtk_main_quit();

}


static gboolean delete_event(GtkWidget *window, GdkEvent *event, gpointer data) {

return FALSE;

}


static gboolean window_state_event(GtkWidget *widget,

GdkEventWindowState *event, gpointer trayIcon) {

if (event->changed_mask == GDK_WINDOW_STATE_ICONIFIED

&& (event->new_window_state == GDK_WINDOW_STATE_ICONIFIED

|| event->new_window_state == (GDK_WINDOW_STATE_ICONIFIED

| GDK_WINDOW_STATE_MAXIMIZED))) {

gtk_widget_hide(GTK_WIDGET(widget));

gtk_status_icon_set_visible(GTK_STATUS_ICON(trayIcon), TRUE);

} else if (event->changed_mask == GDK_WINDOW_STATE_WITHDRAWN

&& (event->new_window_state == GDK_WINDOW_STATE_ICONIFIED

|| event->new_window_state == (GDK_WINDOW_STATE_ICONIFIED

| GDK_WINDOW_STATE_MAXIMIZED))) {

gtk_status_icon_set_visible(GTK_STATUS_ICON(trayIcon), FALSE);

}


return TRUE;

}


注:文中的程序来自网络,笔者已忘记了具体网址,在此向程序的作者道歉!



郑重声明:资讯 【GTK托盘实现】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——