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

2012年(6)

2011年(6)

2010年(30)

2009年(8)

2007年(6)

2005年(4)

我的朋友

分类: LINUX

2010-11-29 01:44:47

    为了方便,再总结一个创建GTK新类型的简单粗暴地步骤。
 
    将LGXXX、Lgxxx、lgxxx替换为相应的类型名称即可。
 
    头文件拷贝以下代码。
#ifndef __GTKLGXXX_H__
#define __GTKLGXXX_H__
#ifdef __cplusplus
  extern "C" {
#endif
#include
#define GTK_LGXXX(obj)  GTK_CHECK_CAST(obj, gtk_lgxxx_get_type (), GtkLgxxx)
#define GTK_LGXXX_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, gtk_lgxxx_get_type (), GtkLgxxxClass)
#define GTK_IS_LGXXX(obj) GTK_CHECK_TYPE(obj, gtk_lgxxx_get_type ())
typedef struct _GtkLgxxx GtkLgxxx;
typedef struct _GtkLgxxxClass GtkLgxxxClass;
struct _GtkLgxxx
{
  GtkWidget  parent;
  // user define members
};
struct _GtkLgxxxClass
{
  GtkWidgetClass  parent_class;
};
guint  gtk_lgxxx_get_type         (void);
GtkWidget* gtk_lgxxx_new          (void);
#ifdef __cplusplus
  }
#endif
#endif /* __GTKLGXXX_H__ */
 
    c文件中主要的
    guint  gtk_lgxxx_get_type         (void);
    GtkWidget* gtk_lgxxx_new          (void);
    拷贝修改即可。
 
static GtkLgxxx'parentType *parent_class = NULL;
GtkWidget * gtk_lgxxx_new(void)
{
  GtkWidget *lgxxx;
  lgxxx = GTK_WIDGET( gtk_type_new ( gtk_lgxxx_get_type()));
  // user do something.
  return lgxxx;
}
guint gtk_lgxxx_get_type (void)
{
  // 每种“类型”只会被创建一次,因此这里定义static形式的变量
  // 这一变量在此就是赋值为0,如果未被创建,在本函数中会进行赋值
  static guint gtk_lgxxx_type = 0;
  if (!gtk_lgxxx_type)
    {
      // 如果该“类型”仍没有被创建,那么这里创建
      // 注意:GtkTypeInfo变量定义也是static的,因为每种“类型”只会对应一份GtkTypeInfo
      static const GtkTypeInfo gtk_lgxxx_info =
      {
        "GtkLgxxx",
        sizeof (GtkLgxxx),
        sizeof (GtkLgxxxClass),
        (GtkClassInitFunc) gtk_lgxxx_class_init,
        (GtkObjectInitFunc) gtk_lgxxx_init,
        /* reserved_1 */ NULL,
        /* reserved_2 */ NULL,
        (GtkClassInitFunc) NULL,
      };
      // 注意下面这句中的gtk_lgxxx'parent_get_type (),需要你明确lgxxx的parent是何类型,比如lgxxx'parent=box。
      // 这里利用了一种递归的方法来实现lgxxx类型的所有父类型都依次会被创建加载
      gtk_lgxxx_type = gtk_type_unique (gtk_lgxxx'parent_get_type (), >k_lgxxx_info);
    }
  return gtk_lgxxx_type;
}
static void gtk_lgxxx_destroy (GtkObject *object)
{
  // user do something.
  parent_class->destroy(object);  // parent_class是全局变量
}
static void gtk_lgxxx_class_init (GtkLgxxxClass *klass)
{
  // 在其他GTK widget代码此函数中经常看到一串的这种定义,直到// ========
  GtkObjectClass *object_class;
  GtkWidgetClass *widget_class;
  object_class = (GtkObjectClass*) klass;
  widget_class = (GtkWidgetClass*) klass;
  // lgxxx新类型是由其父类继承过来的,GTK的类结构还是很有特点的,很好的结构用法.
  // 对于其每一层父类都可以通过类似方式来进行对他们的成员操作。
  // ====================================
  // destroy函数赋值就是一个好例子,注意他是赋值于object_class的
  object_class->destroy = gtk_lgxxx_destroy;
  // 赋值parent_class,我知道有两种方法,更倾向第二种
  // parent_class = gtk_type_class (gtk_lgxxx'parent_get_type());
  parent_class = g_type_class_peek_parent (klass);
  /* 信号和属性登记是另一个问题 */
  // 如果有以下代码就写上
  widget_class->realize = gtk_lgxxx_realize;
  widget_class->size_request = gtk_lgxxx_size_request;
  // ... ...
  // user do something.
}
 
static void gtk_lgxxx_init(GtkLgxxx *lgxxx)
{
  // 对struct _GtkLgxxx中的成员进行初始化。
}
    其他的根据情况写吧。
 
阅读(594) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~