免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4177 | 回复: 4
打印 上一主题 下一主题

请教,多个按钮上放图片问题??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-24 14:44 |只看该作者 |倒序浏览
现在想在一个窗口内放左边竖排着3个,右边2个,共5个按钮,并且每个按钮上有图片。
1
2     5
3     4

我做的下面这个代码,本来是想做成左右2个有图片的按钮,但现在只显示一个,但点击后输出却是123,456,估计是不是覆盖了?

请问怎么左右排着按钮还能显示图片啊






#include <gtk/gtk.h>

GtkWidget *xpm_label_box( gchar     *xpm_filename,
                          gchar     *label_text )
{
    GtkWidget *box;
    GtkWidget *label;
    GtkWidget *image;
    box = gtk_hbox_new (FALSE, 0);
    gtk_container_set_border_width (GTK_CONTAINER (box), 2);
    /* 创建一个图像 */
    image = gtk_image_new_from_file (xpm_filename);
    /* 为按钮创建一个标签 */
    label = gtk_label_new (label_text);
    /* 把图像和标签组装到盒子里 */
    gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
    gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
    gtk_widget_show (image);
    gtk_widget_show (label);
    return box;
}
/*回调函数 */
void callback( GtkWidget *widget,
               gpointer   data )
{
    g_print ("Hello again - %s was pressed\n", (char *) data);
}

int main( int   argc,
          char *argv[] )
{
       GtkWidget *window;
    GtkWidget *button;
    GtkWidget *box;
        gtk_init (&argc, &argv);
    /* 创建一个新窗口 */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Buttons!");
        g_signal_connect (G_OBJECT (window), "destroy",
                   G_CALLBACK (gtk_main_quit), NULL);
    g_signal_connect (G_OBJECT (window), "delete_event",
                G_CALLBACK (gtk_main_quit), NULL);
    /* 设置窗口边框的宽度。*/
    gtk_container_set_border_width (GTK_CONTAINER (window), 100);
  /*****************************************************************/
    box = gtk_vbox_new(FALSE, 0);
    ///* 将box放到主视窗中. */
    //gtk_container_add (GTK_CONTAINER (window), box);
     /* 创建一个新的按钮 */
    button = gtk_button_new ();
    gtk_widget_set_usize(GTK_WIDGET(button),200, 35);// 按钮的宽 和 高
    /* 连接按钮的 "clicked" 信号到我们的回调 */
    g_signal_connect (G_OBJECT (button), "clicked",
               G_CALLBACK (callback), (gpointer) "123");
    /* 调用我们的创建盒的函数 */
    box = xpm_label_box ("123.jpg", "cool button");
    /* 组装和显示所有的构件 */
//gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
     // gtk_box_pack_start(GTK_BOX(box), button, 0, 0, 0);
     //gtk_container_add (GTK_CONTAINER (box), button);
     gtk_widget_set_size_request (GTK_WIDGET(button),150, 30);
    gtk_widget_show(button);
  /*****************************************************************/
    /* 创建一个新的按钮 */
    //button = gtk_button_new ();
     gtk_widget_set_usize(GTK_WIDGET(button),500, 35);// 按钮的宽 和 高
    /* 连接按钮的 "clicked" 信号到我们的回调 */
    g_signal_connect (G_OBJECT (button), "clicked",
               G_CALLBACK (callback), (gpointer) "456");
    box = xpm_label_box ("456.jpg", "cool button");
     gtk_widget_set_size_request (GTK_WIDGET(button),500,600);
    gtk_widget_show(button);
    gtk_widget_show (box);

    gtk_container_add (GTK_CONTAINER (button), box);

        gtk_container_add (GTK_CONTAINER (window), button);
    gtk_widget_show(button);
        gtk_widget_show (window);
    /* 停在这里,等待事件发生。 */
    gtk_main ();

    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2006-04-25 01:25 |只看该作者
程序中只创建了一个按钮(第二次的新建按钮 //button = gtk_button_new (); 被你屏蔽掉了),并且第二次在按钮中加入的文字和图像替换了第一次的(被覆盖),然而按钮的 "clicked" 事件却被连接了两次,当然点一下按钮就出现两次显示了。

你说的按钮排列情况可以看作是一个 vbox 中 pack 了三个 hbox,而第一个 hbox 中又 pack 了一个按钮,另外两个 hbox 中又分别 pack 了两个按钮。对于每个按钮来说,都应当用 gtk_container_add 函数将 xpm_label_box 函数创建的 hbox 作为按钮的 container,这样按钮才能显示设定的文字和图像。

建议阅读 GTK+ 2.0 Tutorial 的 Chapter 5. Packing Widgets。

论坛徽章:
0
3 [报告]
发表于 2006-04-25 11:54 |只看该作者
汇报:经过修改,有2个按钮了,可是按钮上没有图片,继续郁闷修改ing



#include <gtk/gtk.h>

/* 创建一个新的横向盒,它包含一个图像和一个标签,并返回这个盒。*/

GtkWidget *xpm_label_box( gchar     *xpm_filename,
                          gchar     *label_text )
{
    GtkWidget *box;
        GtkWidget *label;
    GtkWidget *image;

    /* 为图像和标签创建盒 */
    box = gtk_hbox_new (FALSE, 0);
    gtk_container_set_border_width (GTK_CONTAINER (box), 2);

    /* 创建一个图像 */
    image = gtk_image_new_from_file (xpm_filename);

    /* 为按钮创建一个标签 */
    label = gtk_label_new (label_text);

    /* 把图像和标签组装到盒子里 */
    gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
    gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);

    gtk_widget_show (image);
    gtk_widget_show (label);

    return box;
}

/* 我们常见的回调函数 */
void callback( GtkWidget *widget,
               gpointer   data )
{
    g_print ("Hello again - %s was pressed\n", (char *) data);
}

int main( int   argc,
          char *argv[] )
{
    /* GtkWidget 是构件的存储类型 */
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *box;
    gtk_init (&argc, &argv);

    /* 创建一个新窗口 */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title (GTK_WINDOW (window), "Hello STB");

    /* 对所有的窗口做这一步是一个好主意。*/
    g_signal_connect (G_OBJECT (window), "destroy",
                      G_CALLBACK (gtk_main_quit), NULL);

    g_signal_connect (G_OBJECT (window), "delete_event",
                       G_CALLBACK (gtk_main_quit), NULL);

    /* 设置窗口边框的宽度。*/
    gtk_container_set_border_width (GTK_CONTAINER (window), 100);
/***************************************************************************************/
    box = gtk_hbox_new(FALSE, 0);

    /* 将box放到主视窗中. */
   gtk_container_add (GTK_CONTAINER (window), box);



    /* 创建一个新的按钮 */
    button = gtk_button_new ();
    gtk_widget_set_usize(GTK_WIDGET(button),200, 35);// 按钮的宽 和 高


    /* 连接按钮的 "clicked" 信号到我们的回调 */
    g_signal_connect (G_OBJECT (button), "clicked",
                      G_CALLBACK (callback), (gpointer) "1 ");

    /* 调用我们的创建盒的函数 */
        //box = xpm_label_box("123.jpg", "1");///*本意是在按钮上显示图片,可是一加就什么都没有了*/
    gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 10);

            gtk_widget_show(button);


/*************************************************************************************/
// box = gtk_vbox_new(FALSE, 0);
   /* 创建一个新的按钮 */
    button = gtk_button_new ();

    gtk_widget_set_usize(GTK_WIDGET(button),200, 35);// 按钮的宽 和 高

    /* 连接按钮的 "clicked" 信号到我们的回调 */
    g_signal_connect (G_OBJECT (button), "clicked",
                      G_CALLBACK (callback), (gpointer) "2 ");

    /* 调用我们的创建盒的函数 */
        //box = xpm_label_box("456.jpg", "2");///*本意是在按钮上显示图片,可是一加就什么都没有了*/


    gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 10);



/*******************************************************************************************/
    /* 组装和显示所有的构件 */
    gtk_widget_show (box);

    gtk_container_add (GTK_CONTAINER (button), box);

    gtk_widget_show (button);

    gtk_container_add (GTK_CONTAINER (window), button);

    gtk_widget_show (window);

    /* 停在这里,等待事件发生。 */
    gtk_main ();

    return 0;
}

论坛徽章:
0
4 [报告]
发表于 2006-04-28 12:07 |只看该作者
嗯,现在问题全部解决,多谢版主,封帖,不要回复了。

论坛徽章:
0
5 [报告]
发表于 2006-04-28 21:45 |只看该作者
楼上?
你是用glade还是纯手写啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP