1 创建标题栏界面
/* XPM格式的图像数据,以C语言源代码形式存于文件中 */
static char * class_xpm[] = {
"16 16 26 1",
" c Red",
". c #dead10",
"X c #f7de84",
"o c #c69418",
"O c #f7d66b",
"+ c #efce52",
"@ c #efbd31",
"# c #efb521",
"$ c #846308",
"% c #d663d6",
"& c #efb518",
"* c #f7adf7",
"= c #f794ff",
"- c #de73de",
"; c #8c298c",
": c #9c7b10",
"> c #6b8494",
", c #d66bd6",
"< c #ffefff",
"1 c #b539b5",
"2 c #5a9cd6",
"3 c #9cceff",
"4 c #4273c6",
"5 c #7bb5e7",
"6 c #00319c",
"7 c #3163b5",
" . ",
" .Xo ",
" .XO+o ",
" .XO+@#$ % ",
" .XO+@&$ %*% ",
" .XO+@#$ %*=-;",
" :+@@$>>>,*=-; ",
" :&: > <1-; ",
" : > ; ",
" > 2 ",
" > 234 ",
" > 23526",
" >>23526 ",
" 726 ",
" 6 ",
" "};
GtkWidget *
creat_title(GtkWidget *data)
{
/*创建框架控件的标题*/
GtkWidget *title;
GtkWidget *hbox;
GtkWidget *image;
GtkWidget *label;
GdkPixmap *pixmap;
GdkBitmap *mask;
pixmap = gdk_pixmap_create_from_xpm_d(
data->window, NULL,
NULL,
class_xpm);
label = gtk_label_new("新的标题");
image = gtk_image_new_from_pixmap(pixmap, NULL);
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;
}
1.1 XPM格式
图形的两种基本类型就是位图(bitmap)和像素映射(pixmaps)。像素映射就是由像素的值所组成的方阵。在矩阵中的每个值都代表某一个像素的一种颜色。一个像素可以包含很多颜色,其最大数目与任一时刻下能够载入到自己调色板中的颜色数相同。
XPM(XPixMap)图形格式是X11中一个标准图形格式,它把图形保存成ASCII文本,一个XPM的定义不仅仅是ASCII形式,它的格式还可以是 C源代码形式的,可以直接将它编辑到自己的应用程序中去。最主要的是可以直接编辑在程序中。更多内容请看参考1:XPM与PNG格式图片的区别。
1.2 gdk_pixmap_create_from_xpm_d( )函数
GdkPixmap* gdk_pixmap_colormap_create_from_xpm_d
(GdkWindow *window,
GdkColormap *colormap,
GdkBitmap **mask,
GdkColor *transparent_color,
gchar **data);
Create a pixmap from data in XPM format using a particular colormap.
- window: a GdkWindow, used to determine default values for the new pixmap. Can be NULL if colormap is given.
- colormap: the GdkColormap that the new pixmap will be use. If omitted, the colormap for window will be used.
- mask: a pointer to a place to store a bitmap representing the transparency mask of the XPM file. Can be NULL, in which case transparency will be ignored.
- transparent_color: the color to be used for the pixels that are transparent in the input file. Can be NULL, in which case a default color will be used.
- data: Pointer to a string containing the XPM data.
Returns : the GdkPixmap.
1.3 gtk_widget_realize函数的作用
gtk_widget_realize这个函数是用来创建该widget对应的GdkWindow和相关资源的。一般我们用不到这个函数,一般是在创建自定义的widget的时候,需要用到。
我们一般不需要使用这个函数的原因是:当我们调用gtk_widget_show_all函数的时候,就会自动调用这个函数。但是 Foundations of GTK+ Developing一书中提到,对于GtkEventBox,_show_all函数并不会调用realize,所以我们需要手动调用一次这个函数。而 且,调用这个函数之前,需要首先调用gtk_container_add这样类似的函数,这是因为GTK要确定eventbox要知道他的parent和 ancestor是谁。
1.4 容器关系
window <----vbox <---- hbox <-----image
<-----frame <----title
<----label
<-----bbox <-----button
<-----pre_button
<-----next_button
<-----ok_button
1.5 代码
#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 char * class_xpm[] = {
"16 16 26 1",
" c Red",
". c #dead10",
"X c #f7de84",
"o c #c69418",
"O c #f7d66b",
"+ c #efce52",
"@ c #efbd31",
"# c #efb521",
"$ c #846308",
"% c #d663d6",
"& c #efb518",
"* c #f7adf7",
"= c #f794ff",
"- c #de73de",
"; c #8c298c",
": c #9c7b10",
"> c #6b8494",
", c #d66bd6",
"< c #ffefff",
"1 c #b539b5",
"2 c #5a9cd6",
"3 c #9cceff",
"4 c #4273c6",
"5 c #7bb5e7",
"6 c #00319c",
"7 c #3163b5",
" . ",
" .Xo ",
" .XO+o ",
" .XO+@#$ % ",
" .XO+@&$ %*% ",
" .XO+@#$ %*=-;",
" :+@@$>>>,*=-; ",
" :&: > <1-; ",
" : > ; ",
" > 2 ",
" > 234 ",
" > 23526",
" >>23526 ",
" 726 ",
" 6 ",
" "};
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 *
creat_title(GtkWidget *data)
{
/*创建框架控件的标题*/
GtkWidget *title;
GtkWidget *hbox;
GtkWidget *image;
GtkWidget *label;
GdkPixmap *pixmap;
GdkBitmap *mask;
pixmap = gdk_pixmap_create_from_xpm_d(
data->window, NULL,
NULL,
class_xpm);
label = gtk_label_new("新的标题");
image = gtk_image_new_from_pixmap(pixmap, NULL);
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 *creat_img_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;
GtkWidget *text;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Splash窗口");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 500, 300);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
/*创建window对应的GdkWindow*/
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("3.image-button.png");
gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 5);
frame = gtk_frame_new(NULL);
title = creat_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);
/* 创建按钮box */
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 = creat_img_button(GTK_STOCK_GO_BACK, "上一提示");
/* 按钮是否可以点击, FALSE按钮是灰色,不可以点击 */
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 = creat_img_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;
}
参考1:XPM与PNG格式图片的区别
参考2:gtk_widget_realize函数的作用
参考3:GTK框架(Frames)
参考4:GTK±3.0
参考5:贴吧文字讲述GTK历史
参考6:GTK±2.0各组件例程
参考7:详细说明各组件360DOC
参考8:详细说明各组建CSDN