• Gtk 窗口,控件,设置(添加图片等)


    1、关于窗口
     
     1     // 创建顶层窗体,后面有POPUP的
     2     GtkWidget *main_window;
     3     main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     4  
     5     // 设置title文字,注意UTF8格式的文字转换,否则是乱码
     6     gtk_window_set_title (GTK_WINDOW (main_window), g_locale_to_utf8("哈哈",-1,NULL,NULL,NULL));
     7  
     8     // 设置窗体图标,用这条语句使所有窗体使用同一个图标,也有独立设置(GTK手册)
     9     gtk_window_set_default_icon_from_file( ICON_WNDICON, NULL);
    10  
    11     // 设置边框宽度,基本随意
    12     gtk_container_set_border_width (GTK_CONTAINER (main_window), 8);
    13  
    14     // 设置模式窗口
    15     gtk_window_set_modal(GTK_WINDOW (window), TRUE);
    16  
    17     // 让窗口总在最前
    18     gtk_window_set_keep_above(GTK_WINDOW (window), TRUE);
    19  
    20     // 移动窗口位置
    21     gtk_window_move(GTK_WINDOW (window), left, top); 
    22     // 也是设置位置的,简单点
    23     gtk_window_set_position(GTK_WINDOW (main_window), GTK_WIN_POS_CENTER);
    24  
    25     // 这个让叉叉无效
    26     gtk_window_set_deletable(GTK_WINDOW (main_window), FALSE);

        设置全屏显示的几种办法:
     1 //a)简单一点就用这个。
     2       gtk_window_maximize(GTK_WINDOW (main_window));
     3  
     4 //b)下面这个有边框但都给挤到屏幕外面了
     5       gtk_window_fullscreen( GTK_WINDOW(main_window)); 
     6 //c)采用设置窗体大小等于screen大小的办法,就是麻烦点
     7       GdkScreen *screen;
     8 
     9       screen = gtk_window_get_screen( GTK_WINDOW( main_window)); 
    10       gtk_window_set_default_size( GTK_WINDOW( main_window), 
    11       gdk_screen_get_width(screen), 
    12       gdk_screen_get_height(screen));

     
        让窗体尺寸不可调整,但是好像与全屏使用时有些问题,会自动地调整窗口的大小
    1       gtk_window_set_resizable(GTK_WINDOW(main_window),FALSE);
    2 //
    3       gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, FALSE, TRUE);
     
        常用的信号:
     1 //(a)点击叉叉
     2       gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
     3 
     4       g_signal_connect (G_OBJECT (main_window), "delete_event", G_CALLBACK (delete_event), NULL);
     5  
     6 //(b)窗口变化,gboolean返回TRUE就行了,继续执行默认过程,同下
     7       gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
     8  
     9       g_signal_connect (G_OBJECT (main_window), "window_state_event", G_CALLBACK (window_state_event), main_window);
    10 //(c)点击别的窗口
    11       gboolean focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
    12  
    13       gtk_signal_connect (GTK_OBJECT(window), "focus-out-event", GTK_SIGNAL_FUNC(popuptoolbar_fout_event), window); 

        POPUP窗口也不错,而且不会在任务栏出现。
    1     window = gtk_window_new(GTK_WINDOW_POPUP);
    2  
    3     //用起来和这个差不多
    4     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    5     gtk_window_set_decorated(GTK_WINDOW (window), FALSE);

        设置一个背景图片,对于整个窗体的,这还真需要点前期策划和艺术细胞,不然效果挺吓人。我还是喜欢后面的那一个办法。
     1     GdkPixbuf *pixbuf;
     2     GdkPixmap *pixmap;
     3 
     4     gtk_widget_set_app_paintable (main_window, TRUE);
     5     gtk_widget_realize (main_window);
     6     pixbuf = gdk_pixbuf_new_from_file (ICON_BGPIC, NULL);
     7     gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, NULL, 128);
     8     gdk_window_set_back_pixmap (main_window->window, pixmap, FALSE);
     9     g_object_unref (pixbuf);
    10     g_object_unref (pixmap);

        对一部分区域设背景图,这个办法比较随意也简单,麻烦一点的地方是需要先做个计算,screen在前面有获得办法。
        同时有说到一个图片缩放的办法。
       
     1     GdkPixbuf *pixbuf;
     2 
     3     image = gtk_image_new_from_file (ICON_BGPIC);
     4     pixbuf = gtk_image_get_pixbuf (GTK_IMAGE(image));
     5     pixbuf = gdk_pixbuf_scale_simple(pixbuf, 
     6        gdk_screen_get_width(screen) - 16, // 16: window border SHIFT 
     7        gdk_screen_get_height(screen) - 140, // 140: height SHIFT
     8        GDK_INTERP_BILINEAR);
     9     gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
    10     // 我放到fixed里了,这个随便
    11     gtk_fixed_put(GTK_FIXED(fixed), image, 0, 0);
     
     
       2、关于按钮
     
       
     1     // 建立按钮
     2     GtkWidget * button;
     3     button = gtk_button_new ();
     4  
     5     // 简单一点的
     6     button = gtk_button_new_with_label ("XX");
     7  
     8     // 要产生那种能用键盘快捷键的按钮
     9     button = gtk_button_new_with_mnemonic(g_locale_to_utf8("确定(_O)", -1,NULL,NULL,NULL));
    10  
    11     // 要好看一点就用一个图片的
    12     // 函数产生一个hbox,然后把botton当作容器放进去,GTK的widget几乎都是容器,所以这个函数还是比较有用的,在产生toolbar的时候也用到。
    13     GtkWidget * create_imagetext_hbox(const char *text,const char *image_path)
    14     {
    15         GtkWidget *box;
    16         GtkWidget *label;
    17         GtkWidget *image;
    18 
    19         image = gtk_image_new_from_file (image_path);
    20         label = gtk_label_new (g_locale_to_utf8(text, -1,NULL,NULL,NULL));
    21         box = gtk_hbox_new (FALSE, 0);
    22         gtk_container_set_border_width (GTK_CONTAINER (box), 2);
    23         gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
    24         gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
    25  
    26         gtk_widget_showall (box);
    27         return box;
    28     }
    29     GtkWidget * create_image_button(const char *text,const char *image_path)
    30     {
    31         GtkWidget * button;
    32         GtkWidget *box;
    33  
    34         box = create_imagetext_hbox(text, image_path);
    35  
    36         button = gtk_button_new ();
    37         gtk_container_add (GTK_CONTAINER (button), box);
    38         gtk_widget_show (button);
    39         return button;
    40     }
    41  
    42     // clicked信号定义
    43     void user_function (GtkButton *button, gpointer user_data)

     
       3、关于entry
     
       
     1     // 建立entry
     2     GtkWidget *entry;
     3     entry = gtk_entry_new ();
     4  
     5     // 让entry显示****
     6     gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
     7  
     8     // 让entry直接响应回车
     9     gtk_signal_connect (GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_event), usrdata);
    10  
    11     // 读/写entry,读出的数据指针指向entry的widget内部,不能直接释放。
    12     gchar *gtk_entry_get_text (GTK_ENTRY (entry))
    13     gtk_entry_set_text (GTK_ENTRY (entry), "XX")
     
       4、关于label
      
     1  // 简单一点
     2     label = gtk_label_new("XX");
     3  
     4     // 让label接受键盘快捷键,并聚焦到某widget
     5     label = gtk_label_new_with_mnemonic (g_locale_to_utf8("输入(_I)", -1,NULL,NULL,NULL));
     6     gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
     7  
     8     // 使用<span></span>控制显示
     9     gtk_label_set_markup(GTK_LABEL(label), <span background='red'>"XXXX"</span>);
    10     // -----------还有好多label用法,慢慢加
     
       5、BOX参数小记
     1     // 建立box
     2     box = gtk_hbox_new (gboolean homogeneous, gint spacing);
     3    //
     4     box = gtk_vbox_new (gboolean homogeneous, gint spacing);
     5  
     6     homogeneous:TRUE,内部widget平均分配box空间,Widget大小不变,只是占地大了,其他地方padding;一般用FALSE即可,是否平均可在pack指定的widget时进行控制。
     7     spacing:内部widget间的间隔,pixel单位。
     8  
     9    // 结合gtk_container_set_border_width (GTK_CONTAINER (box), 8);效果也不错。
    10  
    11     // Pack指定widget到box中
    12     gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
    13     //
    14     gtk_box_pack_end (GTK_BOX (box), widget, FALSE, FALSE, 0);

     
        expand:TRUE,对所有TRUE参数打包进来的widget平均分配box中剩余的空间,但并不填充,仍保持widget原大小。
        fill:TRUE,只有在expand为TRUE时有效,widget改变大小填充满其在box中占有的空间。
        padding:widget与他后面的控件的间隔,pixel单位,最后一个widget将作为与box边缘的间隔。
     
        box其乐无穷呀!
     
       X、封装的代码
        虽然丧失了一定的随意性,但是平常也就这些应用了。
    1     X.1 treeview => LGX_storeview
    2         lgx_storeview的说明和代码
    3  
    4     X.2 toolbar
    5  
    6     X.3 calendar
    7  
    8     X.4 inputdialog
      
     Y、Widget的一些常用方法
     
        Y.1、设定大小
    1       gtk_widget_set_usize(widget, x, y);
     
        Y.2、使其“变灰色”
    1   gtk_widget_set_sensitive(widget, FALSE);
    2   gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
    3 
    4   PangoFontDescription *fontdesc;
    5   fontdesc = pango_font_description_from_string("uming 15");
    6   gtk_widget_modify_font(treeview, fontdesc);
    7   pango_font_description_free(fontdesc);
    8   fontdesc = pango_font_description_from_string("uming");
    9   pango_font_description_set_size (font_desc, 12*PANGO_SCALE);
     
       Z、其他小技巧
     
        Z.1 获得widget的上下左右
       
    1   widget->allocation.x
    2   widget->allocation.y
    3   widget->allocation.height
    4   widget->allocation.width
     
     
  • 相关阅读:
    牛客练习赛71 F-红蓝图 (kruskal重构树 + 线段树合并)
    2020杭电多校第一场 Finding a MEX
    Codeforces 235C Cyclical Quest (后缀自动机)
    HDu6583 Typewriter (后缀自动机 + dp)
    2020牛客暑期多校训练营(第八场)A All-Star Game
    HDu4416 Good Article Good sentence (后缀自动机)
    icpc小米 A . Intelligent Warehouse
    计数类dp
    主席树
    博弈论
  • 原文地址:https://www.cnblogs.com/rain-blog/p/gtk-windows-set.html
Copyright © 2020-2023  润新知