为什么这个GtkFrame上没有边框?

时间:2012-10-21 20:40:53

标签: c gtk frame gtk3

我正在阅读GtkFrame上的教程,我已编译了一些代码示例,但与本教程的screnhoot不同,但我使用GtkFrame的程序没有边框。

以下代码:

#include <gtk/gtk.h>

int main( int   argc,
          char *argv[] )
{
  /* GtkWidget is the storage type for widgets */
  GtkWidget *window;
  GtkWidget *frame;
  GtkWidget *button;
  GtkWidget *label;
  gint i;

  /* Initialise GTK */
  gtk_init(&argc, &argv);

  /* Create a new window */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Frame Example");

  /* Here we connect the "destroy" event to a signal handler */ 
  g_signal_connect (G_OBJECT (window), "destroy",
                      G_CALLBACK (gtk_main_quit), NULL);

  gtk_widget_set_size_request(window, 300, 300);
  /* Sets the border width of the window. */
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  label = gtk_label_new("foo");

  /* Create a Frame */
  frame = gtk_frame_new(NULL);
  gtk_container_add(GTK_CONTAINER(frame), label);
  gtk_widget_set_size_request(frame, 30, 30);

  gtk_container_add(GTK_CONTAINER(window), frame);

  /* Set the frame's label */
  gtk_frame_set_label( GTK_FRAME(frame), "GTK Frame Widget" );

  /* Set the style of the frame */
  gtk_frame_set_shadow_type( GTK_FRAME(frame), GTK_SHADOW_ETCHED_OUT);

  gtk_widget_show(frame);

  /* Display the window */
  gtk_widget_show (window);

  /* Enter the event loop */
  gtk_main ();

  return(0);
}
/* example-end */

生成程序:

enter image description here

我错过了什么?

3 个答案:

答案 0 :(得分:3)

这是GTK错误659926。但是,这似乎主要是因为Adwaita主题(默认的GNOME 3主题)忽略了框架,因此可能更改主题(使用gnome-tweak-tool,如果你想使用GUI)就可以了。但是我认为框架在许多GUI中被滥用,并且经常导致丑陋的界面,因为它们增加了视觉混乱。越少越好。

答案 1 :(得分:0)

您是否尝试过设置框架的阴影类型?

gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_TYPE_IN); 

答案 2 :(得分:0)

您必须使用CSS。

CSS文件示例:

frame#LINMONI_Frame_Inactiv {
    color: grey;
    border-style:solid;
    border-width: 8px;
    border-color: grey;
    background-color: white;
}

,然后创建gtkwidgets:

    GtkCssProvider *provider;
    GdkScreen *screen;
    GdkDisplay *display;

    provider = gtk_css_provider_new();
    display = gdk_display_get_default();
    screen = gdk_display_get_default_screen(display);
    gtk_style_context_add_provider_for_screen(screen, GTK_STYLE_PROVIDER(provider),GTK_STYLE_PROVIDER_PRIORITY_USER);
    gsize bytes_read;
    gsize bytes_written;
    GError *error = NULL;
    if (!gtk_css_provider_load_from_path(provider,g_filename_to_utf8("yourcssfilename.css, csCompleteFileName.GetLength(),&bytes_read, &bytes_written, &error), NULL)){
        if (error){
            Trace_Error("gtk_css_provider_load_from_path=%s\n",error->message);
        }
    }
    g_object_unref(provider);