我想在GTK 3中創建自定義小部件。我注意到繪圖問題只出現在某些GTK主題中,而所有其他主題都很好。我通過調用gtk_render_background()
將問題縮小到了描繪背景的代碼。對於某些主題,背景呈現爲純黑色,但這不是主題的默認背景色。以下是我的繪圖功能的簡化版本。自定義GTK小部件的背景呈現爲純黑色
static void gtk_databox_ruler_draw_ticks(GtkDataboxRuler *ruler)
{
GtkWidget *widget;
GtkStateFlags state;
cairo_t *cr;
GtkStyleContext *style_context;
gint width, height;
if (!gtk_widget_is_drawable(GTK_WIDGET(ruler))) {
return;
}
widget = GTK_WIDGET(ruler);
state = gtk_widget_get_state_flags(widget);
style_context = gtk_widget_get_style_context(widget);
gtk_style_context_save(style_context);
gtk_style_context_add_class(style_context, GTK_STYLE_CLASS_DEFAULT);
gtk_style_context_set_state(style_context, state);
/* <test-code> */
GdkRGBA test;
gtk_style_context_get_background_color(style_context, gtk_widget_get_state_flags(widget), &test);
/* </test-code> */
width = gtk_widget_get_allocated_width(widget);
height = gtk_widget_get_allocated_height(widget);
cr = cairo_create(ruler->priv->backing_surface);
gtk_render_background(style_context, cr, 0, 0, width, height);
gtk_style_context_restore(style_context);
cairo_destroy(cr);
}
我添加了一些測試代碼來查詢的背景顏色,並設置在gdb斷點:
在使用Ubuntu的氛圍主題:
(gdb) print test
$1: test = {red = 0.94901960784313721, green = 0.94509803921568625,
blue = 0.94117647058823528, alpha = 1}
在使用Ubuntu的高對比度主題:
(gdb) print test
$1: test = {red = 0, green = 0, blue = 0, alpha = 0}
我現在不知道如果我在一個錯誤的方式使用新的GtkStyleContext,或是否在主題被打破。我怎樣才能縮小問題的根源?
如果有人能指出我對GtkStyleContext的一個很好的介紹,我也很感激。官方的API文檔對於理解基本概念沒有多大幫助。
我不知道你在哪裏繪圖,但是你只能在繪製虛擬方法中繪製一個小部件,你的代碼中有太多東西會導致意外的行爲,任何事情都可能這樣做 – erick2red
」上面顯示的gtk_databox_ruler_draw_ticks'函數是從小部件的繪圖函數('GtkWidgetClass-> draw')中調用的。你能指出上面代碼中需要修復的東西嗎? – dasup
不知道是否有幫助,但你可以看看[這裏] (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red