1

我在 gtk 中有一个窗口,其中包含一个 Build() 函数,如下所示:

protected virtual void Build()
{
    global::Stetic.Gui.Initialize(this);
    // Widget Client.Forms.Notification
    this.Name = "Client.Forms.Notification";
    this.Title = "Notification";
    this.TypeHint = Gdk.WindowTypeHint.Normal;
    //this.TypeHint = ((global::Gdk.WindowTypeHint)(4));
    this.WindowPosition = ((global::Gtk.WindowPosition)(4));
    // Container child Client.Forms.Notification.Gtk.Container+ContainerChild
    this.vbox1 = new global::Gtk.VBox();
    this.vbox1.Name = "vbox1";
    this.vbox1.Spacing = 6;
    // Container child vbox1.Gtk.Box+BoxChild
    this.label1 = new global::Gtk.Label();
    this.label1.HeightRequest = 20;
    this.label1.Name = "label1";
    this.label1.LabelProp = "Notification";
    this.vbox1.Add(this.label1);
    global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.label1]));
    w1.Position = 0;
    w1.Expand = false;
    w1.Fill = false;
    // Container child vbox1.Gtk.Box+BoxChild
    this.hbox1 = new global::Gtk.HBox();
    this.hbox1.Name = "hbox1";
    this.hbox1.Spacing = 6;
    // Container child hbox1.Gtk.Box+BoxChild
    this.image1 = new global::Gtk.Image();
    this.image1.Name = "image1";
    this.image1.Pixbuf = global::Gdk.Pixbuf.LoadFromResource("Client.Resources.icon.png");
    this.hbox1.Add(this.image1);
    global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.image1]));
    w2.Position = 0;
    w2.Expand = false;
    w2.Fill = false;
    // Container child hbox1.Gtk.Box+BoxChild
    this.label2 = new global::Gtk.Label();
    this.label2.Name = "label2";
    this.label2.WidthRequest = 260;
    this.label2.Wrap = true;
    this.label2.LabelProp = "Description";
    this.hbox1.Add(this.label2);
    global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.label2]));
    w3.Position = 1;
    w3.Expand = false;
    w3.Fill = false;
    this.vbox1.Add(this.hbox1);
    global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.hbox1]));
    w4.Position = 1;
    w4.Expand = false;
    w4.Fill = false;
    this.label1.ModifyBase(Gtk.StateType.Normal, Core.fromColor(System.Drawing.Color.Orange));
    this.ModifyBase(Gtk.StateType.Normal, Core.fromColor(System.Drawing.Color.Orange));
    this.vbox1.ModifyBase(Gtk.StateType.Normal, Core.fromColor(System.Drawing.Color.Orange));
    root = new Gtk.EventBox();
    root.Add(this.vbox1);
    this.Decorated = false;
    this.Add(root);
    if ((this.Child != null))
    {
        this.Child.ShowAll();
    }
    this.DefaultWidth = 460;
    this.DefaultHeight = 220;
}

(整个窗口的源代码:https ://github.com/pidgeonproject/pidgeon/blob/master/Forms/Notification.cs )

如您所见,它正在调用

this.ModifyBase(Gtk.StateType.Normal, Core.fromColor(System.Drawing.Color.Orange));

这应该将背景更改为橙色,但事实并非如此。

我试图在窗口元素上插入更多类似的功能,但它也不起作用,有谁知道如何更改窗口的背景颜色?

我想要做的是创建一个没有特定颜色的装饰(所以只是一个矩形)和一些文本的小窗口。该窗口应该是透明的(现在可以使用),并且应该有一张图片和 2 个带有文本的标签,并且在单击时消失 - 所有这些现在都可以正常工作,只是我无法将背景从灰色更改为更好的颜色。我会很高兴得到可以让我使用其他方式做到这一点的答案(我可以考虑创建一个仅带有绘图区域的小表单并用颜色绘制它,然后也绘制文本,但这对我来说听起来很复杂对于我想做的如此简单的事情)。

注意: mono 使用 GTK 2,.Net 的 GTK# 版本使用 2.12.20

4

3 回答 3

4

尝试使用事件框。似乎工作

于 2013-04-05T19:17:03.293 回答
1

对于 GTK+2,您需要像这样创建一个 gtk 资源:

char *my_custom_style = "style \"my-style-name\" { bg[NORMAL] = \"#339933\" }\nclass \"GtkWindow\" style \"my-style-name\"";

然后在启动程序时加载资源,初始化后:

gtk_rc_parse_string (my_custom_style);

现在任何人GtkWindow都将使用您的自定义样式作为背景。

Gtk 资源文件的 C 文档

编辑:

如果您只想更改一个特定的窗口,那么您可以将自定义样式字符串更改为类似

char *my_custom_style="style \"my-style-name\" { bg[NORMAL] = \"#339933\" }\nwidget \"my-custom-window\" style= \"my-style-name\"';

然后设置要更改背景的窗口的名称

gtk_widget_set_name (GTK_WIDGET (my_window), "my-custom-window");

编辑2:

这是 Gtk# Rc 解析函数的文档:

http://buttle.shangorilla.com/1.1/handlers/monodoc.ashx?link=M%3aGtk.Rc.Parse(System.String)

于 2013-04-06T15:40:46.030 回答
0

文档(针对 C API)说它已gtk_widget_modify_color()被弃用,应该改用新编写的代码gtk_widget_override_background_color(),所以试试吧。

众所周知,在 GTK+ 中覆盖主题非常困难,但 3.0 API 确实听起来好像它支持您想要做的事情。

不幸的是,目前无法自己测试。

于 2013-04-04T09:23:39.150 回答