用C实现C++的多态---剖析GTK的"对象" (四)

七. 写自己的子对象

/**************************************************************

 子对象RenderObject,继承于CObject-------render_object.h

***************************************************************/

#ifndef _H_RENDER_OBJECT_H_
#define _H_RENDER_OBJECT_H_


#define RENDER_OBJECT_TYPE   GetRenderObjectType()
#define IS_RENDER_OBJECT_TYPE(obj) IsObjectType(obj,RENDER_OBJECT_TYPE)
#define RENDER_OBJECT_CLASS(obj) ((RenderObjectClass*)GetObjectClass(obj))

typedef struct _RenderObject  RenderObject;
typedef struct _RenderObjectClass RenderObjectClass;


#ifdef __cplusplus
extern "C" {
#endif


enum
{
 RENDER_BOX  = 1,
 RENDER_TEXT 
};

struct _RenderObject
{
 CObject   base; 
 RenderObject* parent;
 RenderObject* children;
 RenderObject* prev;
 RenderObject* next;
 unsigned short x;
 unsigned short y;
 unsigned short width;
 unsigned short height;
 unsigned short min_width;
 unsigned short max_width;
 unsigned char  render_type;
 unsigned char  have_calc_width:1;
 unsigned char  have_calc_height:1;
 unsigned char  have_layout:1;
 unsigned char  reserved:5; 
};

struct _RenderObjectClass
{
 CObjectClass base;

 void (*draw)(void*);
 int (*calc_width)(void*);
 int (*calc_height)(void*);
 int (*calc_WxH)(void*);
 int (*layout)(void*);
};


int
GetRenderObjectType(void);

RenderObject *
NewRenderObject(void);

void
renderDraw(RenderObject *render);

int
renderCalcWidth(RenderObject *render);

int
renderCalcHeight(RenderObject *render);

int
renderCalcWxH(RenderObject *render);

int
renderLayout(RenderObject *render);

#ifdef __cplusplus
}
#endif
#endif

 

 

/**************************************************************

 子对象RenderObject,继承于CObject-------render_object.c

***************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "render_object.h"


static void
InitRenderObjectClass(RenderObjectClass *vclass)
{
 if(vclass==NULL)
  return;

 vclass->draw = renderDraw;
 vclass->calc_width = renderCalcWidth;
 vclass->calc_height = renderCalcHeight;
 vclass->calc_WxH = renderCalcWxH;
 vclass->layout = renderLayout;
}

static void
InitRenderObject(RenderObject *object)
{
 if(object==NULL)
  return;

 object->x = 0;
 object->y = 0;
 object->width = 0;
 object->height = 0;
 object->min_width = 0;
 object->max_width = 0;
 object->parent = NULL;
 object->children = NULL;
 object->prev = NULL;
 object->next = NULL;
 object->render_type = RENDER_BOX;
 object->have_calc_width = 0;
 object->have_calc_height = 0;
 object->have_layout = 0;
}

int
GetRenderObjectType(void)
{
 static int type = 0;

 if( type==0 )
 {
  static ClassInfo classinfo =
  {
   "RENDEROBJECT",
   sizeof(RenderObject),
   sizeof(RenderObjectClass),
   (pInitObjectCallback)InitRenderObject,
   (pInitClassCallback)InitRenderObjectClass,
  };

  type = RegisterClassType(&classinfo, BASE_OBJECT_TYPE);
 }

 return type;
}


RenderObject*
NewRenderObject(void)
{
 return (RenderObject*)NewClassType(RENDER_OBJECT_TYPE);
}

void
renderDraw(RenderObject *render)
{
}

int
renderCalcWidth(RenderObject *render)
{
 return 0;
}

int
renderCalcHeight(RenderObject *render)
{
 return 0;
}

int
renderCalcWxH(RenderObject *render)
{
 return 0;
}

int
renderLayout(RenderObject *render)
{
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值