你将学到什么

如何实现弹出式菜单

菜单简介

菜单(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;
}

GTK+学习笔记(一)的更多相关文章

  1. GTK学习笔记————创建窗口

    创建gtk1.c文件 代码 #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_ ...

  2. gtk+学习笔记(八)

    框架(Frames)可以用于在盒子中封装一个或一组构件,框架本身还可以有一个标签.标签的位置和盒子的风格可以灵活改变. 框架可以用下面的函数创建: GtkWidget *gtk_frame_new( ...

  3. gtk+学习笔记(五)

    今天继续做的是昨天那个界面对的优化,直接贴下代码, void click_radio(GtkWidget *widget,gpointer *data) { 3 GtkWidget *dialog; ...

  4. gtk+学习笔记(三)

    gtk感觉函数好多,需要记好多函数,还是多练习,多总结,今天写了一个登陆窗口,很简单,主要是为了加深对这些东西的记忆,直接贴代码 #include<gtk/gtk.h> static Gt ...

  5. gtk+学习笔记(二)

    如何创建一个按钮呢,直接贴代码把,有详细的注释. #include<gtk/gtk.h> gint data_count=; void on_button_clicked (GtkWidg ...

  6. GTK学习笔记之Linux下Gtk环境搭建

    下面介绍下Ubuntu 环境下具体的安装过程: 1.配置安装gcc/g++/gdb/make 等基本编程工具(必须装好) 刚装好的Ubuntu系统中已经有GCC了,但是这个GCC几乎什么文件都不能编译 ...

  7. gtk+学习笔记(七)

    今天被一个文本框坑了,基本设置什么的都对,但是就是无法显示中文,按钮名称都可以显示中文,先介绍下文本框的基本函数吧. GtkWidget *gtk_text_view_new(void);新建一个文本 ...

  8. gtk+学习笔记(六)

    今天用到了滚动窗口和微调按钮,根据网上的信息,简单总结下用法. 滚动窗口只能添加一个控件到其中 scrolled=gtk_scrolled_window_new(NULL,NULL); /*创建滚动窗 ...

  9. gtk+学习笔记(四)

    今天看了下单选按钮的设置,实现起来还是挺简单的,就是自己太不熟练 radio=gtk_radio_button_new_with_label(NULL,"a"); //第一次创建单 ...

随机推荐

  1. linux 交换分区 swap

    linux swap分区用来保证内存过载时也可以使用,是在磁盘级别对内存的一次扩展,swap分区必须是一个单独的分区 创建过程: 1.用fdisk 命令新建分区,在创建过程中通过L命令和t命令来调整分 ...

  2. Angular Js 控制器

    在Angularjs中用ng-controller指令定义了应用程序中的控制器:例如: <div ng-app="myApp" ng-controller="myC ...

  3. 仿联想商城laravel实战---7、lavarel中如何给用户发送邮件

    仿联想商城laravel实战---7.lavarel中如何给用户发送邮件 一.总结 一句话总结: 设置邮件服务器,比如163邮箱 lavarel中配置邮件服务,在.env中 控制器中使用Mail对象发 ...

  4. spring boot: EL和资源 (一般注入说明(二) @Service注解 @Component注解)

    @Service用于标注业务层组件 : 将当前类注册为spring的Bean @Controller用于标注控制层组件(如struts中的action) @Repository用于标注数据访问组件,即 ...

  5. POJ1060 Modular multiplication of polynomials解题报告 (2011-12-09 20:27:53)

    Modular multiplication of polynomials Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3 ...

  6. AngularJS学习笔记(四) 自定义指令

    指令(directive)是啥?简单来说就是实现一定功能的XXX...之前一直用的ng-model,ng-click等等都是指令.当我有一个ng没提供的需求的时候,就可以自定义个指令.指令的好处显而易 ...

  7. 将session存入数据库,memcache的方法

    //存入数据库 <?phpif(!$con = mysql_connect('localhost','root','123456')){    die('连接数据库失败');}$link = m ...

  8. 关于对H264码流的PS的封装的相关代码实现

    1.写在开始之前: 最近因为新工作要维护别人留下的GB模块代码,先熟悉了流程,然后也试着封装了下ps流,结果也能通过测试正常预览了,当然,其中开发读文档的头疼,预览花屏,卡帧的事情都有遇到,当时慢慢的 ...

  9. Hive安装配置要点

    官网下载安装包: 在Profile下面定义HIVE_HOME以及HADOOP_HOME,然后在PATH下面添加HOME/bin目录,用于在命令行直接敲beeline,hive即可执行命令: 需要在ha ...

  10. CF 1036B Diagonal Walking v.2——思路

    题目:http://codeforces.com/contest/1036/problem/B 比赛时只能想出不合法的情况还有走到终点附近的方式. 设n<m,不合法就是m<k.走到终点方式 ...