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;
}
GTK+学习笔记(一)的更多相关文章
- GTK学习笔记————创建窗口
创建gtk1.c文件 代码 #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_ ...
- gtk+学习笔记(八)
框架(Frames)可以用于在盒子中封装一个或一组构件,框架本身还可以有一个标签.标签的位置和盒子的风格可以灵活改变. 框架可以用下面的函数创建: GtkWidget *gtk_frame_new( ...
- gtk+学习笔记(五)
今天继续做的是昨天那个界面对的优化,直接贴下代码, void click_radio(GtkWidget *widget,gpointer *data) { 3 GtkWidget *dialog; ...
- gtk+学习笔记(三)
gtk感觉函数好多,需要记好多函数,还是多练习,多总结,今天写了一个登陆窗口,很简单,主要是为了加深对这些东西的记忆,直接贴代码 #include<gtk/gtk.h> static Gt ...
- gtk+学习笔记(二)
如何创建一个按钮呢,直接贴代码把,有详细的注释. #include<gtk/gtk.h> gint data_count=; void on_button_clicked (GtkWidg ...
- GTK学习笔记之Linux下Gtk环境搭建
下面介绍下Ubuntu 环境下具体的安装过程: 1.配置安装gcc/g++/gdb/make 等基本编程工具(必须装好) 刚装好的Ubuntu系统中已经有GCC了,但是这个GCC几乎什么文件都不能编译 ...
- gtk+学习笔记(七)
今天被一个文本框坑了,基本设置什么的都对,但是就是无法显示中文,按钮名称都可以显示中文,先介绍下文本框的基本函数吧. GtkWidget *gtk_text_view_new(void);新建一个文本 ...
- gtk+学习笔记(六)
今天用到了滚动窗口和微调按钮,根据网上的信息,简单总结下用法. 滚动窗口只能添加一个控件到其中 scrolled=gtk_scrolled_window_new(NULL,NULL); /*创建滚动窗 ...
- gtk+学习笔记(四)
今天看了下单选按钮的设置,实现起来还是挺简单的,就是自己太不熟练 radio=gtk_radio_button_new_with_label(NULL,"a"); //第一次创建单 ...
随机推荐
- Mysql Java 驱动安装
怎么安装MYSQL的JDBC驱动 1.下载mysql for jdbc driver. http://dev.mysql.com/downloads/connector/j/5.0.html 2.解压 ...
- Struts 2简介
Struts 2简介 Struts 2 编辑 同义词 Struts2一般指Struts 2 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中 ...
- Delpih - Format
Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用: 首先看它的声明:function Format(const Format: ...
- node nvm
nvm 是 Mac 下的 node 管理工具,有点类似管理 Ruby 的 rvm,如果是需要管理 Windows 下的 node,官方推荐是使用 nvmw 或 nvm-windows . 以下具体说下 ...
- Python习题-一个函数实现读写功能
def new_op_file(filename,content=None): f = open(filename,'a+') f.seek(0) if content: #非空即真,如果有内容就往下 ...
- Java_JS_01_java调用js
二.资源帖 1.JAVA执行javascript方法 2.在Java中直接调用js代码 3.Java执行js脚本 4.Java 8 Nashorn 教程 5.Java 脚本引擎
- 数学建模--matlab基础知识
虽然python也能做数据分析,不过参加数学建模,咱还是用专业的 1. Matlab-入门篇:Hello world! 程序员入门第一式: disp(‘hello world!’) 2. 基本运算 先 ...
- WingIDE用法笔记
注释代码块 方法一: ''' 被注释的代码块 ''' 方法二: 选中要注释的代码块后 Ctrl + /,则选中的每一行都被# , 用这种方法注释的代码,用Shift + Ctrl + / ...
- C语言逗号运算符和逗号表达式
在C语言中逗号","也是一种运算符,称为逗号运算符. 其功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式.其一般形式为:表达式1,表达式2 其求值过程是分别求两个表达式的 ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...