GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑

    前一篇文章里给自己定下个目标——用GTK+做个扫雷。嗯,学了一两天GTK+,有点基础了就着手做起来了,边做边学呗。

    接近四天的时间,现在总算有个像样的东西出来,前来向自己汇报一下。

    首先说下感想,我很是佩服那些图形界面开发的人员。细节要注意得很多,实在很不容易。当然,我想他们应该是有更高级的工具可以辅助的。像GTK+,就我了解的,有glade可以辅助界面设计。但我接触了下,不太习惯,所以就自己纯粹写代码了。

    有点疑问的地方,就是中途想要给按钮上色的时候,发现一个有趣的地方。不多说,上代码:

#include <gtk/gtk.h>

//GdkRGBA rgba_color; //gtk3.0
GdkColor rgb_color; //gtk2.0

typedef GtkWidget *PGtkWidget;
int main (int argc, char* argv[])
{
        PGtkWidget window, button, vbox;

        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), 300, 300);

        button = gtk_button_new_with_label("Hello world!");

        //背景色设定
        //gdk_color_parse("blue", &rgb_color); //gtk2.0
        //gdk_rgba_parse(&rgba_color, "blue"); //gtk3.0
        //gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &rgb_color);//gtk2.0
        //gtk_widget_override_background_color(button, GTK_STATE_NORMAL, &rgba_color);//gtk3.0

        //前景色设定
        gdk_color_parse("red", &rgb_color);//gtk2.0
        //gdk_rgba_parse(&rgba_color, "blue"); //gtk3.0
        gtk_widget_modify_fg(button, GTK_STATE_NORMAL, &rgb_color);//gtk2.0
        //gtk_widget_override_color(button, GTK_STATE_NORMAL, &rgba_color);//gtk3.0

        vbox = gtk_vbox_new(TRUE, 0);//gtk2.0
        //vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);//gtk3.0
        gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
        gtk_container_add(GTK_CONTAINER(window), vbox);

        g_signal_connect(window, "delete_event", gtk_main_quit, NULL);
        gtk_widget_show_all(window);
        gtk_main();
        return 0;
}


终端里输入:

gcc -Wall -o color_button color_button.c $gtk2

其中gtk2是我为了方便而自定义的一个环境变量,具体内容大家懂的,不废话。

运行结果如下:

GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第1张图片


可以看到,前景色并没有显示出来。


还是上面的代码,在终端里输入:

gcc -Wall -o color_button color_button.c $gtk3

同样,gtk3也是我自定义的一个环境变量

运行结果如下:

GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第2张图片


可以看到,红色的前景色有显示出来。


再来看下背景色,还是上述代码,将下面两行注释掉:

//gdk_color_parse("red", &rgb_color);//gtk2.0

//gtk_widget_modify_fg(button, GTK_STATE_NORMAL, &rgb_color);//gtk2.0

将下面两行反注释:

gdk_color_parse("blue", &rgb_color); //gtk2.0

gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &rgb_color);//gtk2.0


如上操作,分别用gtk+2.0的库和gtk+3.0的库编译一下,运行结果如下:左边为2.0, 右边为3.0

GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第3张图片          GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第4张图片


运行结果与前景色的运行结果相反,这次是2.0显示出颜色。

3.0没有显示出颜色,但是神奇的地方就在这里。拖动另外的一个窗口,放在3.0编译出来的color_button窗口上面,结果如下:

GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第5张图片                            GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第6张图片


我在google上查找相关的问题,发现很多人都在问怎么给按钮上色。根据我得来的信息,大概流程是要自己创建一个css文件,然后导入该css文件。

当然,因为俺初学几天,再加上人又懒,就没去深究怎么弄css了。

GTK+的reference manual上有提到css文件的方法,但只是给控件上色的其中一种,但是现在搞得好像只能通过css文件,那么麻烦才能上色,我就只能呵呵了。


我上述给出的示例代码中,有一些后面注释着//gtk3.0,是因为对应的函数是GTK+3.0新有的。

后面注释着//gtk2.0的函数,GTK+3.0的reference manual已经不推荐使用。

所以,我也试过严格按照官方的推荐,使用对应版本的函数。结果还是如同上面所述。

有兴趣的道友可以试下,再来告诉我结果,看是不是我电脑问题。



最后就向自己汇报一下,扫雷任务提前完成。Congratulation!

GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第7张图片       GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第8张图片

GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第9张图片       GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第10张图片GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第11张图片GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第12张图片                GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑_第13张图片

你可能感兴趣的:(GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑)