• 几则GTK+开发技巧


    几则GTK+开发技巧

     

    转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

    作者联系方式:Li XianJing <xianjimli at hotmail dot com>

    更新时间:2006-12-19

     

    这两周在开发SMS应用程序,这是第一次用GTK+开发完整的应用程序。在这个过程中,学到一些小技巧,感觉挺有用的,这里做个笔记。

     

    1.       使用g_object_set_data保存上下文信息。在Win32下,通过SetWindowLong (GWL_USERDATA)在HWND中保存上下文信息,这可以避免使用全局变量。我一直奇怪为什么GtkWidget没有提供类似的功能,难道他们都愿意使用全局变量吗?后来突然想起GObject提供了一个g_object_set_data函数,使用起来非常方便,而GtkWidget是GObject的子类,当然也可以使用了。

     

    2.       避免TreeView在显示时布局,提高运行速度。ListBox是用TreeView实现的,它具有很强的灵活性,比如它允许不同行的高度可以不一样,为了计算整个显示的区域,它先要把所有行的高度计算一遍。但在大多数情况下,行的高度都是固定的,计算一遍完全是浪费时间。我们通过下列方法,设置行为固定高度,可以提高运行速度:

    gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED);

    gtk_tree_view_set_fixed_height_mode(sms_list,TRUE);

    gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(text_render), 2);

     

     

    3.       缓存图标,避免重复加载。自己去管理icon当然可以,不过比较麻烦,其实可以用g_object_set_data_full把icon放到object中去,它还可以自动释放icon,非常简单。

    static GdkPixbuf* sms_listview_load_icon(GObject* object, const char* icon_filename)

    {  

        GdkPixbuf* pixbuf = g_object_get_data(GTK_TREE_MODEL(object), icon_filename);

       

        if(pixbuf == NULL)

        {

            pixbuf = create_pixbuf(icon_filename);

            if(pixbuf != NULL)

            {

                g_object_set_data_full(GTK_TREE_MODEL(object), icon_filename,

                    pixbuf, (GDestroyNotify)g_object_unref);

            }

        }

       

        return pixbuf;

    }   

    4.       判断TextView中是否存在多字节字符。在短信中,只要存在一个多字节字符,就要通过unicodie发送,单条短信长度限制为70个字符。可以通过下列方法判断其中是否包含多字节字符:gtk_text_buffer_get_char_count() < strlen(gtk_text_buffer_get_text())。

     

    5.       获取菜单项的文本内容。GtkMenuItem是GtkBin的子类,通过GtkBin. Child获得Label对象,然后通过gtk_label_get_text获得菜单项的文本内容。

     

    ~~end~~

     

     

  • 相关阅读:
    PreparedStatementUpdateTest.java
    JDBCUtils.java
    StringTest.java
    创建线程的方式四:使用线程池
    用递归实现解决斐波那契数列。
    反射的用处。Class对象的介绍,怎么通过反射创建实例和调用方法。
    基于jenkins+docker+git 持续化自动部署项目(详细版一));
    git常用命令,linus的神作之一。
    电话号码的字母组合。(每天一道,防止痴呆)
    编写一个函数来查找字符串数组中的最长公共前缀。(每天一道防止痴呆)
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167773.html
Copyright © 2020-2023  润新知