awtk开发实践——学习篇9:edit示例(单行编辑器控件)

说明
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  QQ 群 号:513683159 【相互学习】
内容来源
  官方的手册(免费获取)Pxx=该手册的对应页码xx
  github-awtk

说明

  awtk开发实践——学习篇7:创建简单工程(方式二:基于HelloWorld.Xml-Demo工程)
  按照上篇创建工程后:
    ①将label.c文件替换为edit.c文件。
    ②在awtk-c-demo工程/res/assets/default/raw/ui目录下搜索:kb,将其相关kb*.xml文件,全部复制到awtk-simple工程中.(实际有部分用不到),如下:
    kb_int.xml、kb_uint.xml、kb_float.xml、kb_ufloat.xml、kb_hex.xml、kb_phone.xml、kb_default.xml、kb_ascii.xml、kb_ascii_t9.xml、kb_default_t9.xml、kb_default_t9ext.bin、kb_default_t9ext.xml

  关于 edit控件(单行编辑器控件) 介绍,对应书P101。(书中还有更详细内容)
    ①基于 SDL 的平台,单行编辑器控件使用平台原生的输入法,对于嵌入式平台使用内置的输入法。
    ②使用内置的输入法时,软键盘由输入类型决定,开发者可
以自定义软键盘的界面。
    ③edit_twidget_t的子类控件,widget_t的函数均适用于edit_t 控件。
    ④edit_t控件中光标的颜色取的是样式文件中该控件的text_color;若没有设置text_color,则默认是黑色。
    ⑤edit_t本身可以做为容器,放入按钮等控件。有几个特殊的子控件:
     名为"clear"的按钮。点击时清除编辑器中的内容
     名为"inc"的按钮。点击时增加编辑器的值,用于实现类似于 spinbox 的功能
     名为"dec"的按钮。点击时减少编辑器的值,用于实现类似于 spinbox 的功能
     名为"visible"的复选框。勾选时显示密码,反之不显示密码
  关于 keyboard控件(软键盘) 介绍,对应书P170。(书中还有更详细内容)
    软键盘是一个特殊的窗口,由编辑器通过输入法自动打开和关闭。编辑器输入类型和软键盘 UI 资源文件的对应关系。

edit.c

#include "awtk.h"

static ret_t on_changed(void* ctx, event_t* evt) {
  widget_t* target = WIDGET(evt->target);

  log_debug("%s changed\n", target->name);

  return RET_OK;
}

static ret_t on_action_event(void* ctx, event_t* evt) {
  widget_t* target = WIDGET(evt->target);

  log_debug("%s action event\n", target->name);

  return RET_OK;
}

static ret_t on_changing(void* ctx, event_t* evt) {
  widget_t* target = WIDGET(evt->target);

  str_t str;
  str_init(&str, 0);											//初始化字符串对象
  str_from_wstr(&str, widget_get_text(target));					//获取该控件的文本去初始化字符串
  log_debug("%s: %s\n", target->name, str.str);
  str_reset(&str);												//重置字符串为空

  return RET_OK;
}
/* 单行编辑器控件创建函数 */
widget_t* create_edit(widget_t* win, int type, const char* name, const wchar_t* text, int x, int y,
                      int w, int h) {
  widget_t* edit = edit_create(win, x, y, w, h);				//创建edit对象

  widget_on(edit, EVT_VALUE_CHANGED, on_changed, NULL);			//注册指定事件的处理函数
  widget_on(edit, EVT_VALUE_CHANGING, on_changing, NULL);		//注册指定事件的处理函数
  edit_set_input_tips(edit, name);								//设置编辑器的输入提示
  //等效于edit_set_tips(edit, name);
  edit_set_input_type(edit, type);								//设置编辑器的输入类型

  return edit;
}

static ret_t on_click(void* ctx, event_t* e) {
  widget_t* edit1 = WIDGET(ctx);

  widget_set_text(edit1,L"中文    比 如 打 一 个 汉 字  加 一 个 空 格 再 打 一 个 汉 字   a b c 123");
  //设置edit1的文本:为字符串中内容
  return RET_OK;
}

ret_t application_init() {
  widget_t* edit1 = NULL;
  widget_t* edit2 = NULL;
  widget_t* edit3 = NULL;
  widget_t* edit4 = NULL;
  widget_t* win = window_create(NULL, 0, 0, 0, 0);				//创建window对象
  widget_t* button = button_create(win, 0, 0, 0, 0);			//创建button对象

  edit1 = create_edit(win, INPUT_TEXT, "text[3-32]", L"abc", 10, 10, 228, 30);
  widget_set_name(edit1, "edit1");								//设置控件的名称:edit1
  edit_set_text_limit(edit1, 3, 32);							//设置为文本输入及其长度限制,不允许输入超过32个字符,少于3个字符时进入error状态
  edit_set_action_text(edit1, "Test");							//设置软键盘上action按钮的文本
  widget_on(edit1, EVT_IM_ACTION, on_action_event, NULL);		//注册指定事件的处理函数

  edit_set_focus(edit1, TRUE);									//设置为焦点

  edit2 = create_edit(win, INPUT_INT, "int auto fix[1-100]", L"", 10, 50, 228, 30);
  widget_set_name(edit2, "edit2");								//设置控件的名称:edit2
  edit_set_int_limit(edit2, 1, 100, 1);							//设置为整数输入及取值范围:最小1,最大100,步长1
  edit_set_auto_fix(edit2, TRUE);								//设置编辑器是否为自动改正

  edit3 = create_edit(win, INPUT_FLOAT, "float[1-10]", L"1.23", 10, 90, 228, 30);
  widget_set_name(edit3, "edit3");								//设置控件的名称:edit3
  edit_set_float_limit(edit3, 1, 10, 1);						//设置为浮点数输入及取值范围:最小1,最大10,步长1

  create_edit(win, INPUT_PASSWORD, "password", L"", 10, 10 + 128, 228, 30);
  widget_set_name(edit4, "edit4");								//设置控件的名称:edit4	
  edit4 = create_edit(win, INPUT_TEXT, "text", L"readonly", 10, 50 + 128, 228, 30);
  edit_set_readonly(edit4, TRUE);								//设置编辑器是否为只读

  create_edit(win, INPUT_HEX, "hex", L"", 10, 90 + 128, 228, 30);
  create_edit(win, INPUT_CUSTOM, "custom", L"", 10, 130 + 128, 228, 30);

  widget_set_text(button, L"SetText");							//设置按键控件的文本:SetText。
  widget_set_self_layout_params(button, "c", "b:60", "40%", "30");//设置控件自己的布局(缺省布局器)参数(过时,请用widget_set_self_layout)。
  widget_on(button, EVT_CLICK, on_click, edit1);				//注册指定事件的处理函数

  widget_layout(win);											布局当前控件及子控件

  return RET_OK;
}
控件名 输入类型 备注
edit1 文本
edit2 整数
edit3 浮点数
无名 密码
edit4 文本 只读
无名 16进制整数
无名 使用自定义的软键盘
(如计算器等应用不希望弹出系统软键盘)。

  所有的单行编辑器控件均设置两种触发事件:
    ①EVT_VALUE_CHANGED:控件的值改变的事件
    ②EVT_VALUE_CHANGING:控件的值持续改变(如编辑器正在编辑)的事件名
  自定义软键盘,故不会弹出系统软键盘,由于未定义,故没有弹出任何键盘。
  按钮控件设置了点击事件:EVT_CLICK,若点击按键则会将edit1控件上的字修改为:中文   比 如 打 一 个 汉 字 加 一 个 空 格 再 打 一 个 汉 字 a b c 123

执行过程:

  1.生成资源:sh assets_gen.sh,添加新资源故需重新生成资源。
  2.编译:scons
  3.执行:./bin/demo

实现效果:

awtk开发实践——学习篇9:edit示例(单行编辑器控件)

input_type_t:输入类型常量定义表

awtk开发实践——学习篇9:edit示例(单行编辑器控件)

上一篇:git 拉取远端分支到本地切换注意


下一篇:python接口自动化7-参数关联