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

Gtk 如何获取自定义小部件的标准系统颜色,gtk,gtkmm,Gtk,Gtkmm,我正在使用gtkmm编写一个自定义小部件,当我的小部件的一部分被选中时,我想使用标准的选择颜色。例如,当您在文本框中选择文本时,背景颜色(对我而言)变为深蓝色,因此我希望获得相同的深蓝色 我尝试过这个,但我只得到黑色或白色,而不是实际使用的颜色: bool MyWidget::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { Gdk::Cairo::set_source_rgba(cr, get_st

我正在使用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));
}
bool MyWidget::on_draw(const Cairo::RefPtr&cr){
Gdk::Cairo::set_source_rgba(cr,
get_style_context()->get_color(Gtk::STATE_FLAG_SELECTED));
}
使用gtkmm获得标准颜色的正确方法是什么?如果用户更改其颜色主题,这些更改也将反映在此处


或者,定义一些继承自标准系统样式的新CSS样式被认为是最佳实践,这样人们可以根据自己的意愿覆盖我的小部件的颜色,而不会影响其他小部件?

渲染小部件背景的正确方法是使用。此函数将考虑小部件状态和样式

上面的代码变成:

bool
MyWidget::on_draw(const Cairo::RefPtr&cr)
{
双w=获得分配的宽度(),h=获得分配的高度();
Glib::RefPtr context=get_style_context();
上下文->渲染背景(cr、0、0、w、h);
返回true;
}
这样,您的小部件将始终更新以反映主题


如果你想控制小部件的颜色和样式,你应该为你的应用程序使用一个额外的
Gtk::StyleProvider
来加载一个带有所需样式类的自定义CSS片段。

结果证明,这个问题的答案是我在问题中所做的是正确的,除了没有应用于小部件的样式,所以颜色只是黑白的

我必须在小部件的构造函数中添加以下内容:

this->get_style_context()->add_class(GTK_STYLE_CLASS_ENTRY);
获取文本输入样式。当然,这使得ebassi建议的
render_background()
呈现一个文本输入背景,这不是我想要的(我只是想要一个纯色)。因此,我将上面的行(在构造函数中)改为:

在我的渲染功能中,临时设置文本输入样式以获得颜色:

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()
,因为它会绘制一个文本控件的背景,我不想要,我只想要一个实心矩形。

如果是CSS,有没有关于如何获取当前选择颜色的建议?我的小部件呈现一组项目,我想使用选择颜色来更改当前所选项目的背景,但不更改应保留默认背景的整个控件。您可以保存小部件的状态,从其标志中删除所选状态,在整个分配中呈现背景;然后放回选定状态,只在希望显示为选定的区域上渲染背景。不幸的是,这不起作用-
render\u background()
是白色的,无论我是否调用
set\u state\u flags(Gtk::state\u FLAG\u SELECTED,true)
!你有一个与小部件相关联的样式吗?我不知道,我正要离开。如果需要样式,你会认为它们是教程的一部分!您可以以任何方式设置样式上下文,然后使用它调用render_background()。还可以按任何方式定义样式类。我还想指出,get_background_color()被弃用,因为它在CSS中没有意义(图像或渐变不是颜色,可以在CSS中全部使用)。要点是:如果您使用的是样式上下文API,那么您还需要使用render_*API。@ebassi:我只是不想使用-if
get\u background\u color()
,那么更新教程可能是个好主意!我不知道样式类——有没有像本教程这样的例子展示了使用它们的最佳实践?您应该针对gtkmm提交一个bug——gtkmm是一个绑定,它与GTK本身是分开维护的。对于样式类,请参见GtkCssProvider以加载自定义CSS,GtkStyleContext::add_provider()以添加新的提供程序,以及GtkStyleContext::add_class()以向小部件添加类;然后,您需要编写所需的CSS。
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();