二、GTK+2.0一个简单的提示窗口

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值