Gtk TextView在某些情况下显示的文字会有白色的背景框,显得跟界面格格不入,如下图所示:
上图的源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#include <gtk/gtk.h> gboolean key_press ( GtkWidget *window, GdkEventKey *event, gpointer *data ); int main(int argc, char **argv) { GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 400, 300); gtk_window_set_title(GTK_WINDOW(window), ""); GtkWidget *view = gtk_text_view_new(); GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); gtk_text_buffer_set_text ( buf, "窗含西岭千秋雪\n门泊东吴万里船", -1); gtk_text_view_set_editable ( GTK_TEXT_VIEW(view), FALSE ); GtkWidget *hBox = gtk_box_new ( GTK_ORIENTATION_VERTICAL, 0 ); gtk_container_add ( GTK_CONTAINER(window), hBox ); gtk_box_pack_start (GTK_BOX(hBox), view, 0, 0, 0); //GdkColor windowColor = gtk_widget_get_style(window)->bg[GTK_STATE_NORMAL]; //gtk_widget_modify_bg ( view, GTK_STATE_NORMAL, &windowColor ); g_signal_connect(G_OBJECT(window), "destroy", \ G_CALLBACK(gtk_main_quit),NULL); g_signal_connect(G_OBJECT(window), "key-press-event", \ G_CALLBACK(key_press),NULL); gtk_widget_show_all(window); gtk_main(); return 0; } gboolean key_press ( GtkWidget *window, GdkEventKey *event, gpointer *data ) { if ( event->state == GDK_CONTROL_MASK ) { if ( event->keyval == GDK_KEY_c) { gtk_main_quit(); } } } |
编译命令:
1 2 3 |
gcc `pkg-config --cflags --libs gtk+-3.0` transparentBackgroundofTextView.c |
解决办法:添加如下两个语句,将TextView的背景设置成与窗口背景相同即可
1 2 3 4 |
GdkColor windowColor = gtk_widget_get_style(window)->bg[GTK_STATE_NORMAL]; gtk_widget_modify_bg ( view, GTK_STATE_NORMAL, &windowColor ); |
即在上面的源码中反注释掉这两条语句,白色边框就会消失了。
顺带一说,gtk_widget_modify_bg已经是deprecated的,其替代函数也是被弃用了,可能在未来的某一天就不再支持,GTK这方面个人感觉是真的很操蛋,动不动就将某个函数弃用,有些会提供替代品,有些根本就没有替代的函数帮助实现想要的功能。想不明白他们想搞什么,为什么不是保持接口不变,修改内部函数实现过程来达到更新目的呢。每次一用弃用函数就一大堆警告错误出现,虽然可以去掉,也不影响编译,但看着就是不爽。