GTK+学习笔记(一)

你将学到什么

如何实现弹出式菜单

菜单简介

菜单(GtkMenu)由菜单项(GtkMenuItem)构成,菜单项可以是任意构件比如按钮、菜单(子菜单)

菜单项的管理

菜单外壳(GtkMenuShell)是菜单(GtkMenu)和菜单栏(GtkMenuBar)的抽象基类,它提供了管理菜单列表中的菜单项(GtkMenuItem)的方法,菜单项可以被选着或者激活,同样还可以关联一个子菜单,用来实现嵌套菜单。

  • 选着(selected):处于选着状态的菜单项将被高亮显示,如果菜单项是一个子菜单,则会弹出子菜单窗口
  • 激活(active):菜单只有在屏幕可见并且用户正在使用时才处于激活状态;菜单栏只有在用户单击任意菜单项后才处于激活状态。处于激活状态的菜单,将会响应鼠标划过消息,并弹出子菜单窗口。

这里还有一个概念就是当前菜单和当前菜单项。把菜单选着操作看做一个展开的树,当前菜单项就是当前树的叶子节点;当前菜单就是树的根节点,当前菜单会一直获取GTK的捕获并且接收所有的按键消息。

弹出菜单

// 弹出菜单(低版本gtk+使用)
void gtk_menu_popup (GtkMenu *menu, GtkWidget *parent_menu_shell, GtkWidget *parent_menu_item, GtkMenuPositionFunc func, gpointer data, guint button, guint32 activate_time);
// 弹出菜单(高版本gtk+使用)
void gtk_menu_popup_at_pointer (GtkMenu *menu, const GdkEvent *trigger_event);

menu就是我们要弹出的菜单,trigger_event就是鼠标产生的按键消息

添加菜单项

// 给菜单添加一个菜单项
void gtk_menu_shell_append(GtkMenuShell *menu_shell, GtkWidget *child)

menu_shell就是我们创建的菜单,child就是我们创建的菜单项

右键菜单简单实现

项目地址

#include <gtk/gtk.h>

gint on_button_press_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    g_return_val_if_fail(widget != NULL, FALSE);
    g_return_val_if_fail(GTK_IS_MENU(data), FALSE);
    g_return_val_if_fail(event != NULL, FALSE);

    if (event->type == GDK_BUTTON_PRESS)
    {
        GdkEventButton *mouse = (GdkEventButton *) event;
        if (mouse->button == GDK_BUTTON_SECONDARY)
        {
            gtk_widget_show_all(GTK_WIDGET(data));
            // gtk_menu_popup_at_pointer(GTK_MENU(data), event);
            gtk_menu_popup(GTK_MENU(data), NULL, NULL, NULL, NULL, mouse->button, mouse->time);
            return TRUE;
        }
    }
    return FALSE;
}

int main( int argc, char *argv[])
{
    GtkWidget *window;
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 250);
    GtkWidget *label = gtk_label_new("test");
    gtk_container_add(GTK_CONTAINER(window), label);

    GtkWidget *menu = gtk_menu_new();
    GtkWidget *pasteMi = gtk_menu_item_new_with_label("Paste");
    gtk_menu_shell_append(GTK_MENU_SHELL(menu), pasteMi);
    g_signal_connect(window, "button-press-event", G_CALLBACK(on_button_press_event), menu);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}
原文地址:https://www.cnblogs.com/silvermagic/p/9087645.html