(一):写在前面


在这篇文章中主要介绍了GTK+程序中的各种构件,这是解说构件的第一个部分,另外一部分将在下一个小节中讲到。

构件是建立一个GUI程序的基础。在GTK+的长期发展过程中。一些特定的构件逐渐成为了大多数编程工具集和差点儿全部的操作系统的公用标准了。比如,按钮,选择框或者是一个滑动条。

对于GTK+来说,内置了非常多经常使用的专用构件,供我们使用。

(二):GtkButton


GtkButton是一个简单易用的构件,通常被用于触发一个动作。

以下我们来看一下GtkButton的用法:

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WIDGET(window),"GtkButton");
gtk_window_set_default_size(GTK_WINDOW(window),230,150);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window),fixed); button = gtk_button_new_with_label("Quit"); gtk_fixed_put(GTK_FIXED(fixed),button,50,50);
gtk_widget_set_size_request(button,80,35); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),G_OBJECT(window));
g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show_all(window); gtk_main(); return 0;
}

在上面的样例中,就是展示一个按钮放置在一个fixed容器中,当我们按下按钮的时候。程序就会退出。

button = gtk_button_new_with_label("Quit");

这段代码就生成了一个带有标签的GtkButton构件。

同一时候结合我们上一小节学过的事件。为按钮加入对应的事件,就能够了:

g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),G_OBJECT(window));

我们来看一下执行效果:

(三):GtkCheckButton


GtkCheckButton也是一个构件,他有两种状态。“开”和“关”,开表示一个可见的浮复选标记。

我们来看一下他的用法:

#include <gtk/gtk.h>

void toggle_title(GtkWidget *widget,gpointer window)
{
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))){
gtk_window_set_title(window,"GtkCheckButton");
}else{
gtk_window_set_title(window,"");
}
} int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *frame;
GtkWidget *check; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window),230,150);
gtk_window_set_title(GTK_WINDOW(window),"GtkCheckButton"); frame = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window),frame); check = gtk_check_button_new_with_label("Show title");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),TRUE);
GTK_WIDGET_UNSET_FLAGS(check,GTK_CAN_FOCUS); gtk_fixed_put(GTK_FIXED(frame),check,50,50); g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
g_signal_connect(G_OBJECT(check),"clicked",G_CALLBACK(toggle_title),(gpointer)window); gtk_widget_show_all(window); gtk_main();
return 0;
}

我们要展示的功能就是:标题栏的显示状态依据构件GtkCheckButton的状态变化而变化。

    check = gtk_check_button_new_with_label("Show title");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),TRUE);

一个GtkCheckButton构件被生成了而且默觉得已标记(即状态为打开)。

    GTK_WIDGET_UNSET_FLAGS(check,GTK_CAN_FOCUS);

这行代码是取消了对复选框的默认锁定,这样做到原因非常easy。是由于我们能够随意设置复选框外面是否“罩”上一个“框”。

而最上面的监听函数就是实现功能的关键位置:这样。标题栏的显示状态依据构件GtkCheckButton的状态变化而变化。

我们来看一下执行效果:

(四):GtkFrame


GTkFrame是一种装饰性的框架,还能够为他设置一个标签(可有可无)。

我们来看一看GtkFrame是怎样使用的,以及其使用后的效果:

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *table; GtkWidget *frame1;
GtkWidget *frame2;
GtkWidget *frame3;
GtkWidget *frame4; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window),250,250);
gtk_window_set_title(GTK_WINDOW(window),"GtkFrame"); gtk_container_set_border_width(GTK_CONTAINER(window),10); table = gtk_table_new(2,2,TRUE);
gtk_table_set_row_spacings(GTK_TABLE(table),10);
gtk_table_set_col_spacings(GTK_TABLE(table),10);
gtk_container_add(GTK_CONTAINER(window),table); frame1 = gtk_frame_new("Shadow In");
gtk_frame_set_shadow_type(GTK_FRAME(frame1),GTK_SHADOW_IN); frame2 = gtk_frame_new("Shadow out");
gtk_frame_set_shadow_type(GTK_FRAME(frame2),GTK_SHADOW_OUT); frame3 = gtk_frame_new("Shadow Etched In");
gtk_frame_set_shadow_type(GTK_FRAME(frame3),GTK_SHADOW_ETCHED_IN); frame4 = gtk_frame_new("Shadow Etched Out");
gtk_frame_set_shadow_type(GTK_FRAME(frame4),GTK_SHADOW_ETCHED_OUT); gtk_table_attach_defaults(GTK_TABLE(table),frame1,0,1,0,1);
gtk_table_attach_defaults(GTK_TABLE(table),frame2,0,1,1,2);
gtk_table_attach_defaults(GTK_TABLE(table),frame3,1,2,0,1);
gtk_table_attach_defaults(GTK_TABLE(table),frame4,1,2,1,2); g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),G_OBJECT(window)); gtk_widget_show_all(window); gtk_main();
return 0;
}

这个实例我们展示了四种不同风格的frame框架。这些框架构件是利用表格所无法布局的。

 frame1 = gtk_frame_new("Shadow In");
gtk_frame_set_shadow_type(GTK_FRAME(frame1),GTK_SHADOW_IN);

我们生成了一个GtkFrame构件,而且还为他设置了阴影种类。

(五):GtkLabel


GtkLabel的功能非常明显,是用来显示文字的,当然。他也会支持markup语法,我们在这里展示两个样例:

1:普通GtkLabel的使用

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *label; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(window),"Nymohetamine");
gtk_window_set_default_size(GTK_WINDOW(window),350,400); label = gtk_label_new("Cold was my soul\n\
Untold was the pain\n\
I faced when you left me\n\
A rose in the rain....\n\
So I swore to the razor\n\
That never,enchained\n\
Would your dark nails of faith\n\
Be pushed through my veins again\n\
\n\
Bared on your tomb\n\
I'm a prayer for your loneliness\n\
And would you ever soon\n\
Come above onto me? \n\
On the binds of your lowliness\n\
I could always find the slot for your sacred key "); gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER); gtk_container_add(GTK_CONTAINER(window),label); g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show_all(window); gtk_main();
return 0;
}

在这里显示了一个歌词。居中显示,我们来看一下执行效果:

2:支持markup语法的label

以下我们来展示GtkLabel怎样支持markup语法:

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *label; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(window),"markup label"); char *str = "<b>ZetCode</b>,Knowledge only matters"; label = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(label),str); gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER); gtk_container_add(GTK_CONTAINER(window),label); gtk_widget_show(label); gtk_window_set_default_size(GTK_WINDOW(window),300,100); g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show(window); gtk_main();
return 0;
}

以下就是支持markup语法效果的label:

(六):写在后面


在这里,我们先介绍几种经常使用的GTK+中的构件,后面一节我们会接着介绍GTK+中还有哪些实用的构件。

注:下载代码

GTK+重拾--09 GTK+中的组件(一)的更多相关文章

  1. GTK+重拾--07 GTK+中的事件

    (一):写在前面 在这一个小节中,我们主要是学习GTK+2.0中最重要的部分.就是信号和事件.GTK+函数工具库是基于"事件"系统的.全部的GUI应用都是基于"事件&qu ...

  2. 重拾SQL——表中索值

    2016.10.23 + 2016.11.02 1.选择所有数据(查看整表) MariaDB [tianyuan]> select * from pet; +----------+------- ...

  3. 重拾算法之复杂度分析(大O表示法)

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  4. CSS魔法堂:重拾Border之——更广阔的遐想

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  5. CSS魔法堂:重拾Border之——不仅仅是圆角

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  6. CSS魔法堂:重拾Border之——图片作边框

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  7. [linux]重拾linux

    起因 因为想重拾起linux,同时需要用docker起几个镜像,用来学习网络知识.本来想直接去阿里云上买,后来一想自己机器上,起一个linux是个不错的选择,毕竟不花钱! 还可以用来做本地测试,学习使 ...

  8. LotusPhp中配置文件组件LtConfig详解

    LotusPhp中配置文件组件LtConfig是约定的一个重要组成部分,适用于多个场景,多数的LotusPhp组件如数据库,缓存,RBAC,表单验证等都需要用到配置组件,LtConfig配置组件也是L ...

  9. 重拾linux

    重拾linux 起因 因为想重拾起linux,同时需要用docker起几个镜像,用来学习网络知识.本来想直接去阿里云上买,后来一想自己机器上,起一个linux是个不错的选择,毕竟不花钱! 还可以用来做 ...

随机推荐

  1. JAVA判断一个字符串里面有没有汉字

    private static boolean checkIfExistChineseCharacter(String s) { return !(s.length() == s.getBytes(). ...

  2. msvs命令行编译lua5.3.4

    msvs命令行编译lua5.3.4 vslua.bat @echo off md bin md lib md include cd src cl /c /nologo /W3 /O2 /Ob1 /Oi ...

  3. POJ - 1469 COURSES (匈牙利算法入门题)

    题意: P门课程,N个学生.给出每门课程的选课学生,求是否可以给每门课程选出一个课代表.课代表必须是选了该课的学生且每个学生只能当一门课程的. 题解: 匈牙利算法的入门题. #include < ...

  4. Delivering Goods UVALive - 7986(最短路+最小路径覆盖)

    Delivering Goods UVALive - 7986(最短路+最小路径覆盖) 题意: 给一张n个点m条边的有向带权图,给出C个关键点,问沿着最短路径走,从0最少需要出发多少次才能能覆盖这些关 ...

  5. 洛谷 P2197 【模板】nim游戏 解题报告

    P2197 [模板]nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以 ...

  6. hdu 1847 Good Luck in CET-4 Everybody! SG函数SG引理

    大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考 ...

  7. Android四大组件:Service

    前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍对Service进行全面介绍(基础认识.生命周期.使用和应用场景) 目录 目录 1. 基础知识 定义:服务,属于Androi ...

  8. [ CodeVS冲杯之路 ] P1098

     不充钱,你怎么AC? 题目:http://codevs.cn/problem/1098/ 显然就是使每堆牌达到总体的平均数,尽量使每次移动时的牌数最大,这就类似于飞行棋,将几个棋子叠起来一起走是最优 ...

  9. SSM+redis整合(mybatis整合redis做二级缓存)

    SSM:是Spring+Struts+Mybatis ,另外还使用了PageHelper 前言: 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷 ...

  10. Centos 6.3Yum安装NodeJS

    1. 添加epel源: (1)查看机器位数 file /sbin/init 或者 file /bin/ls (2)X64: rpm -ivh http://download.fedoraproject ...