如何获取自定义小部件的标准系统颜色

时间:2015-03-08 11:26:59

标签: gtk gtkmm

我正在使用gtkmm编写自定义小部件,我想在选择部分小部件时使用标准选择颜色。例如,当您在文本框中选择文本时,背景颜色(对我来说)是深蓝色,因此我想获得相同的深蓝色。

我试过这个,但我只得到黑色或白色,而不是实际使用的颜色:

bool MyWidget::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) {
    Gdk::Cairo::set_source_rgba(cr,
        get_style_context()->get_color(Gtk::STATE_FLAG_SELECTED));
}

使用gtkmm获取标准颜色的正确方法是什么,这样如果用户更改颜色主题,更改也会反映在这里?

或者,最好的做法是定义一些从标准系统继承的新CSS样式,以便人们可以根据需要覆盖我的小部件的颜色,而不会影响其他人?

2 个答案:

答案 0 :(得分:0)

呈现窗口小部件背景的正确方法是使用gtk_render_background()。此功能将考虑小部件状态和样式。

上面的代码变为:

bool
MyWidget::on_draw (const Cairo::RefPtr<Cairo::Context>& cr)
{
  double w = get_allocated_width(), h = get_allocated_height();
  Glib::RefPtr<Gtk::StyleContext> context = get_style_context();

  context->render_background(cr, 0, 0, w, h);

  return true;
}

这样,您的小部件将始终更新以反映主题。

如果要控制窗口小部件的颜色和样式,则应为应用程序使用额外的Gtk::StyleProvider来加载具有所需样式类的自定义CSS片段。

答案 1 :(得分:0)

原来这个问题的答案就是我在问题中所做的是正确的,除了没有应用于小部件的样式,所以颜色只是黑色和白色。

我必须在小部件的构造函数中添加它:

this->get_style_context()->add_class(GTK_STYLE_CLASS_ENTRY);

获取文本输入样式。当然这使ebassi所建议的render_background()呈现了一个文本输入背景,这不是我想要的(我只想要一个纯色。)所以我将上面的行(在构造函数中)更改为:

this->get_style_context()->add_class(GTK_STYLE_CLASS_DEFAULT);

在我的渲染功能中,暂时设置文本输入样式只是为了获得颜色:

auto cxStyle = this->get_style_context();
cxStyle->context_save();
cxStyle->add_class(GTK_STYLE_CLASS_ENTRY);
Gdk::Cairo::set_source_rgba(cr, cxStyle->get_background_color(Gtk::STATE_FLAG_SELECTED));
cr->fill();
cxStyle->context_restore();

这样我就可以获得文本选择颜色,并在我的自定义窗口小部件区域后面填充一个矩形,该矩形应该显示为当前选中。

我不能在这里使用render_background(),因为它会绘制我不想要的文本控件的背景,我只想要一个实心填充的矩形。

相关问题