私有数据

一个部件的各种功能的实现都会用到数据,例如:文本编辑框,它会保存当前编辑的文本内容,调用相关函数可以对这个文本内容进行读写操作,在绘制时也会需要用到这些文本内容以在屏幕上绘制出相应的文字。

部件私有数据的操作函数有以下两个:

  1. void *Widget_AddData( LCUI_Widget widget, LCUI_WidgetPrototype proto, size_t data_size );
  2. void *Widget_GetData( LCUI_Widget widget, LCUI_WidgetPrototype proto );

从以上代码中可以看出部件私有数据有添加和获取这两种方法,私有数据是与部件原型绑定的,添加时需要指定具体的内存占用大小。添加后,可以调用 Widget_GetData() 函数获取私有数据,这个函数也同样需要指定原型。

以下是这两个函数的基本用法示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <LCUI_Build.h>
  5. #include <LCUI/LCUI.h>
  6. #include <LCUI/gui/widget.h>
  7. /** 部件私有数据的结构 */
  8. typedef struct MyWidgetRec_ {
  9. int a;
  10. char b;
  11. double c;
  12. char *str;
  13. } MyWidgetRec, *MyWidget;
  14. static struct MyWidgetModule {
  15. LCUI_WidgetPrototype prototype;
  16. // 其它用得到的数据
  17. // xxxx
  18. // ...
  19. } self;
  20. static void MyWidget_OnInit( LCUI_Widget w )
  21. {
  22. MyWidget data;
  23. const size_t size = sizeof( MyWidgetRec );
  24. data = Widget_AddData( w, self.prototype, size );
  25. // 初始化私有数据
  26. data->a = 123;
  27. data->b = 'b';
  28. data->c = 3.1415926;
  29. data->str = malloc( 256 * sizeof(char) );
  30. strcpy( data->str, "this is my widget." );
  31. printf( "my widget is inited.\n" );
  32. }
  33. static void MyWidget_OnDestroy( LCUI_Widget w )
  34. {
  35. MyWidget data = Widget_GetData( w, self.prototype );
  36. // 释放私有数据占用的内存资源
  37. free( data->str );
  38. printf( "my widget is destroied.\n" );
  39. }
  40. void LCUIWidget_AddMyWidget( void )
  41. {
  42. int i;
  43. self.prototype = LCUIWidget_NewPrototype( "mywidget", NULL );
  44. self.prototype->init = MyWidget_OnInit;
  45. self.prototype->destroy = MyWidget_OnDestroy;
  46. // 如果全局用得到的数据的话
  47. // self.xxxx = ???
  48. }

原文: https://docs.lcui.lc-soft.io/zh-cn/gui_widgets/data.html