今天花了一些时间复习之前学习过的gtk,感觉东西光学不用忘得好快啊,在这做个之前学过的内容的备份,希望对大家有用,也希望大家不要从入门到放弃。文中有些代码例子可能来自《GTK从入门到精通》吧,我不记得了,或者叫《GTK中文教程》,忘记了,总之,这是一个学习笔记,希望不触及任何人的利益,起到共享学习之用
目录
编译方法
编译脚本
01.一个简单的按钮
02.两个按钮
03.vbox:一张图片+一个按钮
04.一个简单的提示窗口:下一步+上一步+确定
05.多按钮:一个简单的键盘
编译方法
gcc main.c ‘pkg-config --libs --cflags gtk+-3.0'
或者使用gtk-2.0。
编译成功后自动创建 .out可执行文件夹:
./ X.out 执行操作方法
编译脚本
#!/bin/bash
if [ $# -lt 1 ]; then
echo “usage: $0 [main.c]”
exit
fi
gcc -o a $1 pkg-config --libs --cflags gtk+-2.0
01.一个简单的按钮
#include <gtk/gtk.h>
//#include “temp.c”
/* 这是一个回调函数。data 参数在本示例中被忽略。
* 后面有更多的回调函数示例。*/
void hello( GtkWidget *widget, gpointer data )
{
g_print (“Hello World\n”);//temp(data );
}
gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
{
/* 如果你的 “delete_event” 信号处理函数返回 FALSE,GTK 会发出 “destroy” 信号。
* 返回 TRUE,你不希望关闭窗口。
* 当你想弹出“你确定要退出吗?”对话框时它很有用。*/
g_print (“delete event occurred\n”);
/* 改 TRUE 为 FALSE 程序会关闭。*/
return FALSE;
}
/* 另一个回调函数 */
void destroy( GtkWidget *widget, gpointer data )
{
gtk_main_quit ();
}
int main( int argc, char *argv[] )
{
/* GtkWidget 是构件的存储类型 */
GtkWidget *window;
GtkWidget *button;
/* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/
gtk_init (&argc, &argv);
/* 创建一个新窗口 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* 当窗口收到 “delete_event” 信号 (这个信号由窗口管理器发出,通常是“关闭”
* 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 delete_event() 函数。
* 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/
g_signal_connect (G_OBJECT (window), “delete_event”,
G_CALLBACK (delete_event), NULL);
/* 在这里我们连接 “destroy” 事件到一个信号处理函数。
* 对这个窗口调用 gtk_widget_destroy() 函数或在 “delete_event” 回调函数中返回 FALSE 值
* 都会触发这个事件。*/
g_signal_connect (G_OBJECT (window), “destroy”,
G_CALLBACK (destroy), NULL);
/* 设置窗口边框的宽度。*/
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
/* 创建一个标签为 “Hello World” 的新按钮。*/
button = gtk_button_new_with_label (“Hello World”);
/* 当按钮收到 “clicked” 信号时会调用 hello() 函数,并将NULL传给
* 它作为参数。hello() 函数在前面定义了。*/
g_signal_connect (G_OBJECT (button), “clicked”,
G_CALLBACK (hello), “1”);
/* 当点击按钮时,会通过调用 gtk_widget_destroy(window) 来关闭窗口。
* “destroy” 信号会从这里或从窗口管理器发出。*/
// g_signal_connect_swapped (G_OBJECT (button), “clicked”,
// G_CALLBACK (gtk_widget_destroy),window);
/* 把按钮放入窗口 (一个 gtk 容器) 中。*/
gtk_container_add (GTK_CONTAINER (window), button);
/* 最后一步是显示新创建的按钮和窗口 */
gtk_widget_show (button);
gtk_widget_show (window);
/* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里
* 等待事件 (如键盘事件或鼠标事件) 的发生。*/
gtk_main ();
return 0;
}
02.两个按钮
#include <gtk/gtk.h>
/* 我们新改进的回调函数。传递到该函数的数据将打印到标准输出(stdout)。*/
void callback( GtkWidget *widget, gpointer data )
{
g_print (“%s “, (gchar *) data);
}
/* 另一个回调函数 */
gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
{
gtk_main_quit ();
return FALSE;
}
int main( int argc, char *argv[] )
{
/* GtkWidget 是构件的存储类型 */
GtkWidget *window;
GtkWidget *button;
GtkWidget *box1;
gtk_init (&argc, &argv);
/* 创建一个新窗口 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* 这是一个新的调用,设置窗口标题为”Hello Buttons!” */
gtk_window_set_title (GTK_WINDOW (window), “Hello Buttons!”);
/* 在这里我们为 delete_event 设置了一个处理函数来立即退出 GTK。*/
g_signal_connect (G_OBJECT (window), “delete_event”,
G_CALLBACK (delete_event), NULL);
/* 设置窗口边框的宽度。 */
gtk_container_set_border_width (GTK_CONTAINER (window), 20);
/* 我们创建了一个组装盒。详情参见“组装”章节。我们看不见组装盒,它仅被作为排列构件的工具。*/
box1 = gtk_hbox_new (FALSE, 1);
/* 把组装盒放入主窗口中。*/
gtk_container_add (GTK_CONTAINER (window), box1);
/* 创建一个标签为 “Button 1” 的新按钮。*/
button = gtk_button_new_with_label (“Hello”);
/* 当按钮被按下时,我们调用 “callback” 函数,并将一个指向 “button 1” 的指针作为它的参数。*/
g_signal_connect (G_OBJECT (button), “clicked”, G_CALLBACK (callback), “hello”);
/* 代替 gtk_container_add,我们把按钮放入不可见的组装盒,该组合盒已经组装进窗口中了。*/
gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);
/* 总是记住这一步,它告诉 GTK 我们为这个按钮做的准备工作已经完成了,现在可以显示它了。*/
gtk_widget_show (button);
/* 同样创建第二个按钮。*/
button = gtk_button_new_with_label (“World”);
g_signal_connect (G_OBJECT (button), “clicked”, G_CALLBACK (callback), “World”);
gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);
gtk_widget_show (button);
/* 同样创建第3个按钮。*/
button = gtk_button_new_with_label (“!”);
g_signal_connect (G_OBJECT (button), “clicked”, G_CALLBACK (callback), “!”);
gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);
gtk_widget_show (button);
gtk_widget_show (box1);
gtk_widget_show (window);
/* 停在这里等待事件发生。*/
gtk_main ();
return 0;
}
03.vbox:一张图片+一个按钮
/* 创建SPLASH窗口 splash.c */
#include <gtk/gtk.h>
//主函数
int main (int argc,char* argv[])
{
GtkWidget* window ;
GtkWidget* vbox ;
GtkWidget* image ;
GtkWidget* button ;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_POPUP);//no boundary
gtk_window_set_title(GTK_WINDOW(window),”Splash窗口”);
g_signal_connect(G_OBJECT(window),”destroy”,
G_CALLBACK(gtk_main_quit),NULL);
//gtk_container_set_border_width(GTK_CONTAINER(window),20);
//gtk_window_set_default_size(GTK_WINDOW(window),500,400);
//gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
image = gtk_image_new_from_file(“b.png”);
gtk_box_pack_start(GTK_BOX(vbox),image,FALSE,FALSE,0);
button = gtk_button_new_with_label(“Splash窗口”);
g_signal_connect(G_OBJECT(button),”clicked”,
G_CALLBACK(gtk_main_quit),NULL);
gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0);
gtk_widget_show_all(window);
gtk_main();
return FALSE;
}
04.一个简单的提示窗口:下一步+上一步+确定
/* 每日提示 tips.c */
#include <gtk/gtk.h>
//XPM格式的图像数据,以C语言源代码形式存于文件中
static char * book_open_xpm[] = {
“16 16 4 1″,
” c None s None”,
“. c black”,
“X c #808080”,
“o c white”,
” “,
” .. “,
” .Xo. … “,
” .Xoo. ..oo. “,
” .Xooo.Xooo… “,
” .Xooo.oooo.X. “,
” .Xooo.Xooo.X. “,
” .Xooo.oooo.X. “,
” .Xooo.Xooo.X. “,
” .Xooo.oooo.X. “,
” .Xoo.Xoo..X. “,
” .Xo.o..ooX. “,
” .X..XXXXX. “,
” ..X……. “,
” .. “,
” “};
//自定义提示信息
static gchar *info[5] = {
“此软件用于测试每日提示功能的实现,如果你发现问题请及时回复。”,
“我们的目的是把GTK+2.0的大多数功能奉献给每一位自由软件爱好者和开发者。”,
“每一位Linux的支持者都会让我们增加一分信心,Linux最终仍是台式计算机操作系统。”,
“计算机软件技术是一种科学技术,它和人类历史上其他的科学技术一样,是允许每一人自由使用的。”,
“当前你测试完此程序后,请设法把它附加到你创作的软件当中去,这是你成功的第一步。”
};
static GtkWidget *window; //主窗口
static GtkWidget *frame; //框架
static GtkWidget *pre_button; //上一提示按钮
static GtkWidget *next_button; //下一提示按钮
static GtkWidget *label; //提示信息内容标签
static GtkWidget *title; //框架的标题
gint current_info = 0 ;//当前提示信息计数
GtkWidget* create_title (GtkWidget *data)
{ //创建框架控件的标题
GtkWindow *title;
GtkWidget *hbox;
GtkWidget *image;
GtkWidget *label;
GdkPixmap *pixmap;
GdkBitmap *mask;
pixmap = gdk_pixmap_create_from_xpm_d(
data->window,&mask,
>K_WIDGET(data)->style->white,
book_open_xpm);
image = gtk_image_new_from_pixmap(pixmap,NULL);
label = gtk_label_new(“新的标题”);
hbox = gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,2);
gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,2);
return hbox ;
}
GtkWidget* create_button (gchar* stockid,gchar* title)
{ //创建带图像的按钮
GtkWidget *button;
GtkWidget *image;
GtkWidget *label;
GtkWidget *hbox;
image = gtk_image_new_from_stock(stockid,GTK_ICON_SIZE_MENU);
label = gtk_label_new(title);
hbox = gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,3);
button = gtk_button_new();
gtk_container_add(GTK_CONTAINER(button),hbox);
return button;
}
void pre_info (GtkButton *button,gpointer data)
{ //上一提示
gint i ;
i = current_info – 1 ;
if(i == -1) return ;
if(i == 0 ) gtk_widget_set_sensitive(pre_button,FALSE);
current_info = i ;
gtk_widget_set_sensitive(next_button,TRUE);
gtk_label_set_text(GTK_LABEL(label),info[current_info]);
}
void next_info (GtkButton *button,gpointer data)
{ //下一提示
gint i ;
i = current_info + 1 ;
if(i == 5) return ;
if(i == 4) gtk_widget_set_sensitive(next_button,FALSE);
current_info = i ;
gtk_widget_set_sensitive(pre_button,TRUE);
gtk_label_set_text(GTK_LABEL(label),info[current_info]);
}
int main ( int argc , char* argv[])
{
GtkWidget *hbox ;
GtkWidget *vbox;
GtkWidget *bbox;
GtkWidget *button;
GtkWidget *image;
GtkWidget *title;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window),”delete_event”,
G_CALLBACK(gtk_main_quit),NULL);
gtk_window_set_title(GTK_WINDOW(window),”每日提示”);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_container_set_border_width(GTK_CONTAINER(window),10);
gtk_widget_realize(window);
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
hbox = gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,5);
image = gtk_image_new_from_file(“l.bmp”);
gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,5);
frame = gtk_frame_new(NULL);
title = create_title(window);
gtk_frame_set_label_widget(GTK_FRAME(frame),title);
gtk_box_pack_start(GTK_BOX(hbox),frame,TRUE,TRUE,5);
label = gtk_label_new(NULL);
gtk_label_set_text(GTK_LABEL(label),info[0]);
gtk_label_set_line_wrap(GTK_LABEL(label),TRUE);
gtk_container_add(GTK_CONTAINER(frame),label);
bbox = gtk_hbutton_box_new();
gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox),GTK_BUTTONBOX_END);
gtk_box_set_spacing(GTK_BOX(bbox),5);
gtk_box_pack_start(GTK_BOX(vbox),bbox,FALSE,FALSE,5);
button = gtk_check_button_new_with_label(“每次启动时显示”);
gtk_box_pack_start(GTK_BOX(bbox),button,FALSE,FALSE,5);
pre_button = create_button(GTK_STOCK_GO_BACK,”上一提示”);
gtk_widget_set_sensitive(pre_button,FALSE);
g_signal_connect(G_OBJECT(pre_button),”clicked”,
G_CALLBACK(pre_info),NULL);
gtk_box_pack_start(GTK_BOX(bbox),pre_button,FALSE,FALSE,5);
next_button = create_button(GTK_STOCK_GO_FORWARD,”下一提示”);
g_signal_connect(G_OBJECT(next_button),”clicked”,
G_CALLBACK(next_info),NULL);
gtk_box_pack_start(GTK_BOX(bbox),next_button,FALSE,FALSE,5);
button = gtk_button_new_from_stock(GTK_STOCK_OK);
g_signal_connect(G_OBJECT(button),”clicked”,
G_CALLBACK(gtk_main_quit),NULL);
gtk_box_pack_start(GTK_BOX(bbox),button,FALSE,FALSE,5);
gtk_widget_show_all(window);
gtk_main();
return FALSE;
}