为了方便,再总结一个创建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) |