Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198777
  • 博文数量: 60
  • 博客积分: 3269
  • 博客等级: 中校
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2005-09-21 10:48
文章存档

2012年(6)

2011年(6)

2010年(30)

2009年(8)

2007年(6)

2005年(4)

我的朋友

分类: C/C++

2010-01-12 04:22:50

    简单的东西就是因为简单才容易忘记,就像GTK,总以为找找以前的代码或到网络上查一下就可以解决,但是时间却在这个过程中悄悄地流失。
 
    简单记一下,再用时就方便了。
 
    1、关于窗口
 
    // 创建顶层窗体,后面有POPUP的
    GtkWidget *main_window;
    main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
    // 设置title文字,注意UTF8格式的文字转换,否则是乱码
    gtk_window_set_title (GTK_WINDOW (main_window), g_locale_to_utf8("哈哈",-1,NULL,NULL,NULL));
 
    // 设置窗体图标,用这条语句使所有窗体使用同一个图标,也有独立设置(GTK手册)
    gtk_window_set_default_icon_from_file( ICON_WNDICON, NULL);
 
    // 设置边框宽度,基本随意
    gtk_container_set_border_width (GTK_CONTAINER (main_window), 8);
 
    // 设置模式窗口
    gtk_window_set_modal(GTK_WINDOW (window), TRUE);
 
    // 让窗口总在最前
    gtk_window_set_keep_above(GTK_WINDOW (window), TRUE);
 
    // 移动窗口位置
    gtk_window_move(GTK_WINDOW (window), left, top);
    // 也是设置位置的,简单点
    gtk_window_set_position(GTK_WINDOW (main_window), GTK_WIN_POS_CENTER);
 
    // 这个让叉叉无效
    gtk_window_set_deletable(GTK_WINDOW (main_window), FALSE);
    设置全屏显示的几种办法:
    a)简单一点就用这个。
      gtk_window_maximize(GTK_WINDOW (main_window));
 
    b)下面这个有边框但都给挤到屏幕外面了
      gtk_window_fullscreen( GTK_WINDOW(main_window)); 
    c)采用设置窗体大小等于screen大小的办法,就是麻烦点
      GdkScreen *screen;

      screen = gtk_window_get_screen( GTK_WINDOW( main_window)); 
      gtk_window_set_default_size( GTK_WINDOW( main_window), 
      gdk_screen_get_width(screen), 
      gdk_screen_get_height(screen));
 
    让窗体尺寸不可调整,但是好像与全屏使用时有些问题,会自动地调整窗口的大小
      gtk_window_set_resizable(GTK_WINDOW(main_window),FALSE);
    或
      gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, FALSE, TRUE);
 
    常用的信号:
    a)点击叉叉
      gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)

      g_signal_connect (G_OBJECT (main_window), "delete_event", G_CALLBACK (delete_event), NULL);
 
    b)窗口变化,gboolean返回TRUE就行了,继续执行默认过程,同下
      gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
 
      g_signal_connect (G_OBJECT (main_window), "window_state_event", G_CALLBACK (window_state_event), main_window);
    c)点击别的窗口
      gboolean focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
 
      gtk_signal_connect (GTK_OBJECT(window), "focus-out-event", GTK_SIGNAL_FUNC(popuptoolbar_fout_event), window);
    POPUP窗口也不错,而且不会在任务栏出现。
    window = gtk_window_new(GTK_WINDOW_POPUP);
 
    用起来和这个差不多
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_decorated(GTK_WINDOW (window), FALSE);

    设置一个背景图片,对于整个窗体的,这还真需要点前期策划和艺术细胞,不然效果挺吓人。我还是喜欢后面的那一个办法。
    GdkPixbuf *pixbuf;
    GdkPixmap *pixmap;

    gtk_widget_set_app_paintable (main_window, TRUE);
    gtk_widget_realize (main_window);
    pixbuf = gdk_pixbuf_new_from_file (ICON_BGPIC, NULL);
    gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, NULL, 128);
    gdk_window_set_back_pixmap (main_window->window, pixmap, FALSE);
    g_object_unref (pixbuf);
    g_object_unref (pixmap);
    对一部分区域设背景图,这个办法比较随意也简单,麻烦一点的地方是需要先做个计算,screen在前面有获得办法。
    同时有说到一个图片缩放的办法。
    GdkPixbuf *pixbuf;

    image = gtk_image_new_from_file (ICON_BGPIC);
    pixbuf = gtk_image_get_pixbuf (GTK_IMAGE(image));
    pixbuf = gdk_pixbuf_scale_simple(pixbuf,
       gdk_screen_get_width(screen) - 16, // 16: window border SHIFT
       gdk_screen_get_height(screen) - 140, // 140: height SHIFT
       GDK_INTERP_BILINEAR);
    gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
    // 我放到fixed里了,这个随便
    gtk_fixed_put(GTK_FIXED(fixed), image, 0, 0);
 
 
   2、关于按钮
 
    // 建立按钮
    GtkWidget * button;
    button = gtk_button_new ();
 
    // 简单一点的
    button = gtk_button_new_with_label ("XX");
 
    // 要产生那种能用键盘快捷键的按钮
    button = gtk_button_new_with_mnemonic(g_locale_to_utf8("确定(_O)", -1,NULL,NULL,NULL));
 
    // 要好看一点就用一个图片的
    // 函数产生一个hbox,然后把botton当作容器放进去,GTK的widget几乎都是容器,所以这个函数还是比较有用的,在产生toolbar的时候也用到。
    GtkWidget * create_imagetext_hbox(const char *text,const char *image_path)
    {
        GtkWidget *box;
        GtkWidget *label;
        GtkWidget *image;

        image = gtk_image_new_from_file (image_path);
        label = gtk_label_new (g_locale_to_utf8(text, -1,NULL,NULL,NULL));
        box = gtk_hbox_new (FALSE, 0);
        gtk_container_set_border_width (GTK_CONTAINER (box), 2);
        gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
 
        gtk_widget_showall (box);
        return box;
    }
    GtkWidget * create_image_button(const char *text,const char *image_path)
    {
        GtkWidget * button;
        GtkWidget *box;
 
        box = create_imagetext_hbox(text, image_path);
 
        button = gtk_button_new ();
        gtk_container_add (GTK_CONTAINER (button), box);
        gtk_widget_show (button);
        return button;
    }
 
    // clicked信号定义
    void user_function (GtkButton *button, gpointer user_data)

 
   3、关于entry
 
    // 建立entry
    GtkWidget *entry;
    entry = gtk_entry_new ();
 
    // 让entry显示****
    gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
 
    // 让entry直接响应回车
    gtk_signal_connect (GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_event), usrdata);
 
    // 读/写entry,读出的数据指针指向entry的widget内部,不能直接释放。
    gchar *gtk_entry_get_text (GTK_ENTRY (entry))
    gtk_entry_set_text (GTK_ENTRY (entry), "XX")
 
   4、关于label
    // 简单一点
    label = gtk_label_new("XX");
 
    // 让label接受键盘快捷键,并聚焦到某widget
    label = gtk_label_new_with_mnemonic (g_locale_to_utf8("输入(_I)", -1,NULL,NULL,NULL));
    gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
 
    // 使用控制显示
    gtk_label_set_markup(GTK_LABEL(label), "XXXX");
    // -----------还有好多label用法,慢慢加
 
   5、BOX参数小记
    // 建立box
    box = gtk_hbox_new (gboolean homogeneous, gint spacing);
    或
    box = gtk_vbox_new (gboolean homogeneous, gint spacing);
 
    homogeneous:TRUE,内部widget平均分配box空间,Widget大小不变,只是占地大了,其他地方padding;一般用FALSE即可,是否平均可在pack指定的widget时进行控制。
    spacing:内部widget间的间隔,pixel单位。
 
    结合gtk_container_set_border_width (GTK_CONTAINER (box), 8);效果也不错。
 
    // Pack指定widget到box中
    gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
    或
    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、Widget的一些常用方法
 
    X.1、设定大小
      gtk_widget_set_usize(widget, x, y); // 从2.2开始不建议使用,下面语句代替
      gtk_widget_set_size_request (frame, 60, 60);
 
    X.2、使其“变灰色”
      gtk_widget_set_sensitive(widget, FALSE);
 
    X.3、g_object_set_data()和g_object_get_data()
      g_object_set_data(GObject* object, gchar* key,  gpointer user_data)
      g_object_get_data(GObject* object, gchar* key)
      这两个方法是操作使用者定义的@key索引的数据的,与@object本身的属性无关,甚至可以与其属性key名称相同。
      charstring = "helloworld";
      g_object_set_data(G_OBJECT(Obj), STRING_KEY, string);
      char* var = g_object_get_data(G_OBJECT(Obj), STRING_KEY);
 
    X.4、g_object_set()和g_object_get()
      设置object的内部定义属性。
      g_object_set(G_OBJECT(Obj), "key-name", key-value, NULL );
      @key-value类型需要参考一下相应的手册。
 
    X.5、设置文字的字体和大小
      gtk2用pango的相关函数可以改变字体大小,也比较合适。
 
      PangoFontDescription *fontdesc;
      fontdesc = pango_font_description_from_string(font);
      gtk_widget_modify_font(widget, fontdesc);
      pango_font_description_free(fontdesc);

      调用 pango_font_description_from_string(("Sans 10");
      Sans 10的10就是字体的size。
 
      这样用也不错
      fontdesc = pango_font_description_from_string("uming");
      pango_font_description_set_size (font_desc, 12*PANGO_SCALE);
 
      如果是label可以用简单的方法。 
      gtk_label_set_markup(GTK_LABEL(label), "Red Text");
      gtk_label_set_markup(GTK_LABEL(label), "Red Text");
      第4节有关label有点讲解。
 
      gtk1.3应该是使用以下方法
      GtkStyle *style; 
      PangoFontDescription *fontdesc;

      style = gtk_widget_get_style (widget); 
      fontdesc = pango_font_description_from_string(font); 
      style->font_desc = fontdesc; 
      gtk_widget_set_style (widget, style);
 
 
   Y、慢慢整理的
 
  gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
 
=====================
if (GTK_TOGGLE_BUTTON (widget)->active)
 
=====================
 // 将已画好的窗口提到前面来
      gtk_window_present (GTK_WINDOW (window));
 // 一般这样用,适合于多窗口,非模式
 if (window)
    {
      gtk_window_present (GTK_WINDOW (window));
      return;
    }

 
   Z、其他小技巧
 
    Z.1 获得widget的上下左右
      widget->allocation.x
      widget->allocation.y
      widget->allocation.height
      widget->allocation.width
 
    Z.2 去掉console窗口
      开发win32的GTK程序经常使用console app,有个console窗口,调试方便,mingw去掉它容易,Vc编译就需要加上以下部分。
    #ifdef WIN32
      #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
    #endif

    Z.3 GB2312等转UTF8
      Gtk显示文字需要utf8编码的,linux下打出的中文基本默认为utf8,与不同系统下的编辑器有关,Win下一般就是GB2312,所以在编程时GTK widget文字需要进行转换。
      g_locale_to_utf8(text, -1,NULL,NULL,NULL);即可
 
      GTK widget接受的输入却是utf8的,直接使用。
 
 
阅读(2177) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~