• 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;
    }
    
  • 相关阅读:
    flexbox子盒子order属性
    将页面中表格数据导出excel格式的文件(vue)
    vue.js生命周期钩子函数及缓存
    js获取n分钟(或n小时或n个月)后(或前)的时间(日期)
    微信小程序之模版的使用(template)
    微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)
    关于UUID
    关于axios及其在vue中的配置
    Vue.js之下拉列表及选中触发事件
    基于iview的后台管理
  • 原文地址:https://www.cnblogs.com/silvermagic/p/9087645.html
Copyright © 2020-2023  润新知