第43章

EDIT-编辑控件

本期教程讲解STemWin支持的编辑控件。

43.1编辑控件介绍

43. 2 官方WIDGET_Edit实例

43. 3 对话框上使用编辑框控件

43. 4 总结

43.1

编辑控件介绍

编辑字段通常用作输入文本的主要用户界面:

也可使用编辑字段以二进制、十进制或十六进制模式输入值。十进制模式编辑字段的外观与下表所列

类似。与复选框类似,编辑字段在禁用时显示为灰色:

开启皮肤设置后,编辑框的显示效果如下:

43.1.1编辑框支持的通知代码

以下事件是编辑框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:

消息

描述

WM_NOTIFICATION_CLICKED

已被点击。

WM_NOTIFICATION_RELEASED

已被释放。

WM_NOTIFICATION_MOVED_OUT

已被点击,且指针已移出控件,但没有释放。

WM_NOTIFICATION_VALUE_CHANGED

编辑小工具的值 (内容)已更改。

43.1.2编辑框支持的键盘反应

如果控件具有输入焦点,则它将对下列各键做出反应:

按键

反应

GUI_KEY_UP

上升当前字符。例如,如果当前字符 (光标下的字符)为 “A”, 则 变 为 “B”。

GUI_KEY_DOWN

下降当前字符。例如,如果当前字符为为 “B”,则变为 “A”。

GUI_KEY_RIGHT

将光标向右移动一个字符。

GUI_KEY_LEFT

将光标向左移动一个字符。

GUI_KEY_BACKSPACE

如果小工具在文本模式下操作,则删除光标前的字符。

GUI_KEY_DELETE

如果小工具在文本模式下操作,则删除当前字符。

GUI_KEY_INSERT

如果小工具在文本模式下操作,则此键在GUI_EDIT_MODE_OVERWRITE

和GUI_EDIT_MODE_INSERT之间切换编辑模式。

43.2

官方WIDGET_Edit实例

官方的这个例子演示了部分EDIT控件API的使用。这个例子在模拟器中的位置:

源代码如下(官方的这个例子有BUG,下面是修改前的,也就是源代码):

#include "GUI.h"

#include "EDIT.h"

#define WM_APP_SHOW_TEXT (WM_USER + 0)(1)

#define TEXT_MAXLEN 40(2)

static void _cbBk(WM_MESSAGE * pMsg) {

static WM_HWIN hEdit;

static U8 ShowText;

char aBuffer[TEXT_MAXLEN];

hEdit = 0;

ShowText = 0;

switch (pMsg->MsgId) {

case WM_PAINT:

GUI_SetBkColor(GUI_DARKGRAY);

GUI_Clear();

GUI_SetFont(&GUI_Font24_ASCII);

GUI_DispStringHCenterAt("WIDGET_Edit - Sample", 160, 5);

GUI_SetFont(&GUI_Font8x16);

if (ShowText) {

GUI_DispStringHCenterAt("The string you have modified is:", 160, 90);

EDIT_GetText(hEdit, aBuffer, TEXT_MAXLEN);

GUI_DispStringHCenterAt(aBuffer, 160, 110);

} else {

GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90);

}

break;

case WM_APP_SHOW_TEXT:

if (hEdit == 0) {

hEdit = pMsg->hWinSrc;

}

WM_HideWindow(hEdit);

ShowText = 1;

WM_InvalidateWindow(WM_HBKWIN);

WM_CreateTimer(WM_HBKWIN, 0, 3000, 0);

break;

case WM_TIMER:

ShowText = 0;

WM_InvalidateWindow(WM_HBKWIN);

WM_ShowWindow(hEdit);

break;

default:

WM_DefaultProc(pMsg);

}

}

static void _cbEdit(WM_MESSAGE * pMsg) {(3)

const WM_KEY_INFO * pInfo;

WM_MESSAGE Msg;

switch (pMsg->MsgId) {

case WM_KEY:(4)

pInfo = (WM_KEY_INFO *)pMsg->Data.p;

if (pInfo->Key == GUI_KEY_ENTER) {

if (pInfo->PressedCnt == 0) {

Msg.MsgId = WM_APP_SHOW_TEXT;

Msg.hWinSrc = pMsg->hWin;

WM_SendMessage(WM_HBKWIN, &Msg);

return;

}

}

}

EDIT_Callback(pMsg);(5)

}

void MainTask(void) {

EDIT_Handle hEdit;

GUI_Init();

WM_SetCallback(WM_HBKWIN, _cbBk);(6)

hEdit = EDIT_CreateEx(50, 110, 220, 25, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_EDIT0, TEXT_MAXLEN);(7)

WM_SetCallback(hEdit, _cbEdit);(8)

EDIT_SetText(hEdit, "Press when done...");

EDIT_SetFont(hEdit, &GUI_Font8x16);

EDIT_SetTextColor(hEdit, 0, GUI_RED);

EDIT_EnableBlink(hEdit, 300, 1);(9)

while (1) {

GUI_Delay(10);

}

}

这个实例中函数static void _cbBk(WM_MESSAGE * pMsg)存在问题,需要做如下修改:

static void _cbBk(WM_MESSAGE * pMsg) {

static WM_HWIN hEdit = 0;(10)

static U8 ShowText = 0;

char aBuffer[TEXT_MAXLEN];

//hEdit = 0;

//ShowText = 0;

switch (pMsg->MsgId) {

case WM_PAINT:(11)

GUI_SetBkColor(GUI_DARKGRAY);

GUI_Clear();

GUI_SetFont(&GUI_Font24_ASCII);

GUI_DispStringHCenterAt("WIDGET_Edit - Sample", 160, 5);

GUI_SetFont(&GUI_Font8x16);

if (ShowText) {

GUI_DispStringHCenterAt("The string you have modified is:", 160, 90);

EDIT_GetText(hEdit, aBuffer, TEXT_MAXLEN);

GUI_DispStringHCenterAt(aBuffer, 160, 110);

} else {

GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90);

}

break;

case WM_APP_SHOW_TEXT:(12)

if (hEdit == 0) {

hEdit = pMsg->hWinSrc;

}

WM_HideWindow(hEdit);

ShowText = 1;

WM_InvalidateWindow(WM_HBKWIN);

WM_CreateTimer(WM_HBKWIN, 0, 3000, 0);

break;

case WM_TIMER:(13)

ShowText = 0;

WM_InvalidateWindow(WM_HBKWIN);

WM_ShowWindow(hEdit);

break;

default:

WM_DefaultProc(pMsg);

}

}

1.自定义回调函数的消息。

2.定义编辑框中可以显示字符的个数。

3.编辑框的回调函数,默认情况下,编辑框的回调函数是在emWin库函数中自带执行的,不需要用户专门的做一个回调函数,如果用户需要在编辑框的回调函数中加入处理代码的话,可以通过函数WM_SetCallback来指定编辑框的回调函数。

4.编辑框回调函数中的WM_KEY消息。如果用户在键盘上按下Enter回车键,那么就会给桌面窗口发送前面自定义的消息。

5.emWin库中自带的编辑框回调函数EDIT_Callback(pMsg);

6.设置桌面窗口的回调函数。

7.创建编辑框。

8.设置编辑框的回调函数。

9.这个函数用于使能或者禁止光标闪烁。

10.这个函数是桌面窗口的回调函数,由于官方的提供的这个函数是存在问题的,这里专门的做了修改,注意红体字。

11.桌面窗口的WM_PAINT消息。根据ShowText变量来改变不同的显示值。

12.桌面窗口中自定义的消息,如果收到这个消息后,隐藏编辑框,设置ShowText = 1,然后将桌面窗口设置为无效,从而会执行桌面窗口的WM_PAINT消息,最后给桌面窗口建立一个定时器,时间是3000ms。

13.定时器消息,3000ms的时间到了以后设置ShowText = 1,将桌面窗口无效,从而执行重绘消息,并将编辑框显示出来。

实际显示效果如下:

43.3

对话框上使用编辑框控件

用uCGUIBulder4.0建立一个如下的界面(分辨率480*272):

通过这个例子主要是显示一下编辑框支持的五种显示方式,设置的位置如下:

源代码如下(可以直接复制到模拟器或者开发板上面显示):

#include

#include "GUI.h"

#include "DIALOG.h"

#include "WM.h"

#include "BUTTON.h"

#include "CHECKBOX.h"

#include "DROPDOWN.h"

#include "EDIT.h"

#include "FRAMEWIN.h"

#include "LISTBOX.h"

#include "MULTIEDIT.h"

#include "RADIO.h"

#include "SLIDER.h"

#include "TEXT.h"

#include "PROGBAR.h"

#include "SCROLLBAR.h"

#include "LISTVIEW.h"

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {

{ FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 480,272,FRAMEWIN_CF_MOVEABLE,0},

{ EDIT_CreateIndirect, "armfly", GUI_ID_EDIT0, 239,36, 100,21, 0,0},

{ TEXT_CreateIndirect, "TextMode", GUI_ID_TEXT0, 81, 36, 106,24, 0,0},

{ TEXT_CreateIndirect, "FloatMode", GUI_ID_TEXT4, 81, 199,118,24, 0,0},

{ TEXT_CreateIndirect, "DecMode", GUI_ID_TEXT3, 81, 158,94, 24, 0,0},

{ TEXT_CreateIndirect, "BinMode", GUI_ID_TEXT2, 81, 117,94, 24, 0,0},

{ TEXT_CreateIndirect, "HexMode", GUI_ID_TEXT1, 81, 73, 94, 24, 0,0},

{ EDIT_CreateIndirect, "FFFF", GUI_ID_EDIT1, 239,73, 100,21, 0,0},

{ EDIT_CreateIndirect, "11110000", GUI_ID_EDIT2, 239,120,100,21, 0,0},

{ EDIT_CreateIndirect, "128", GUI_ID_EDIT3, 239,163,100,21, 0,0},

{ EDIT_CreateIndirect, "12.123456", GUI_ID_EDIT4, 239,199,100,21, 0,0}

};

void PaintDialog(WM_MESSAGE * pMsg)

{

WM_HWIN hWin = pMsg->hWin;

}

void InitDialog(WM_MESSAGE * pMsg)

{

WM_HWIN hWin = pMsg->hWin;

//

//FRAMEWIN

//

FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);

FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);

FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);

FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);

FRAMEWIN_SetTitleHeight(hWin,35);

//

//GUI_ID_EDIT0

//

EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT0),&GUI_Font16B_ASCII);

EDIT_SetText(WM_GetDialogItem(hWin,GUI_ID_EDIT0),"armfly");

//

//GUI_ID_TEXT0

//

TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_Font24B_ASCII);

//

//GUI_ID_TEXT4

//

TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT4),&GUI_Font24B_ASCII);

//

//GUI_ID_TEXT3

//

TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&GUI_Font24B_ASCII);

//

//GUI_ID_TEXT2

//

TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&GUI_Font24B_ASCII);

//

//GUI_ID_TEXT1

//

TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&GUI_Font24B_ASCII);

//

//GUI_ID_EDIT1

//

EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT1),&GUI_Font16B_ASCII);

EDIT_SetHexMode(WM_GetDialogItem(hWin,GUI_ID_EDIT1),65535,0,255);(1)

//

//GUI_ID_EDIT2

//

EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT2),&GUI_Font16B_ASCII);

EDIT_SetBinMode(WM_GetDialogItem(hWin,GUI_ID_EDIT2),240,0,255);(2)

//

//GUI_ID_EDIT3

//

EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT3),&GUI_Font16B_ASCII);

EDIT_SetDecMode(WM_GetDialogItem(hWin,GUI_ID_EDIT3),128,0,255,0,0);(3)

//

//GUI_ID_EDIT4

//

EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT4),&GUI_Font16B_ASCII);

EDIT_SetFloatMode(WM_GetDialogItem(hWin,GUI_ID_EDIT4),12.12346,0,255,6,0);(4)

}

static void _cbCallback(WM_MESSAGE * pMsg)

{

int NCode, Id;

WM_HWIN hWin = pMsg->hWin;

switch (pMsg->MsgId)

{

case WM_PAINT:

PaintDialog(pMsg);

break;

case WM_INIT_DIALOG:

InitDialog(pMsg);

break;

case WM_KEY:

switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)

{

case GUI_KEY_ESCAPE:

GUI_EndDialog(hWin, 1);

break;

case GUI_KEY_ENTER:

GUI_EndDialog(hWin, 0);

break;

}

break;

case WM_NOTIFY_PARENT:

Id = WM_GetId(pMsg->hWinSrc);

NCode = pMsg->Data.v;

switch (Id)

{

case GUI_ID_OK:

if(NCode==WM_NOTIFICATION_RELEASED)

GUI_EndDialog(hWin, 0);

break;

case GUI_ID_CANCEL:

if(NCode==WM_NOTIFICATION_RELEASED)

GUI_EndDialog(hWin, 0);

break;

}

break;

default:

WM_DefaultProc(pMsg);

}

}

void MainTask(void)

{

GUI_Init();

WM_SetDesktopColor(GUI_WHITE);

WM_SetCreateFlags(WM_CF_MEMDEV);

PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);

FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);

PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);

BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);

CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);

DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);

SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);

SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);

HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);

RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);

GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);

}

1.设置16进制显示。

2.设置2进制显示。

3.设置10进制显示。

4.设置浮点数显示。

实际的显示效果如下:

43.4

总结

本期教程主要是跟大家讲解了编辑框的使用,希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的编辑框API,其它的API大家都可以试试。

winedit使用教程_【STemWin教程入门篇】第43章 EDIT-编辑控件相关推荐

  1. Android开发 入门篇(二) - 常用UI控件

    文章目录 控件 Button TextView EditText ImageView ProgressBar AlertDialog ProgressDialog 布局 LenearLayout an ...

  2. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第三章:简单控件

    第 3 章 简单控件 本章介绍了App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图.容纳视图的常用布局.响应点击的按钮控件.显示图片的图像视图等.然后结合本章所学的知识,演示了一个实战项 ...

  3. SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  4. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  5. SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 SAP UI5 表格控件使用方法介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  6. SAP UI5 应用开发教程之六十五 - 基于 OData V4 的 SAP UI5 表格控件如何实现创建,编辑和保存功能

    本教程前几个步骤,我们已经用 SAP UI5 table 控件开发了一个包含 User 列表的应用,并且支持了根据 LastName 字段进行查询,以及排序的操作. SAP UI5 应用开发教程之六十 ...

  7. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能

    本教程的上一个步骤,我们学习了如何基于 OData V4 开发一个最简单的使用了 Table(表格)控件的 SAP UI5 应用. SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 ...

  8. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

  9. C语言入门——《明解C语言》入门篇第四章练习

    新开C语言专栏整理一下学C的艰苦之路,先从看书+视频开始. 整理了<明解C语言>入门篇第四章练习的"参考答案",记录一下学习的过程.直接上代码. 练习4-1 int m ...

最新文章

  1. 计算机专业的第二批本科大学,我校22个专业入选第二批一流本科专业建设“双万计划”...
  2. python flask源码解析_用尽洪荒之力学习Flask源码
  3. MyISAM与InnoDB的索引实现
  4. WriteFile写UNICODE字符串 TxT显示乱码
  5. tengine安装问题
  6. mapper里面select id 后面一直红名_YTG晨晨改ID“进厂找班上了”,如此自嘲,心态还挺好...
  7. 阿里AI解锁车场景:达摩院技术输出,天猫精灵进驻奔驰、奥迪和沃尔沃
  8. 从城市到矿山!成都睿铂与Microdrones 海外三维建模案例
  9. SQLSERVER 函数大全
  10. 下列哪种不是python元组的定义方式_python笔试题
  11. warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
  12. BURP安装Turbo Intruder插件报错问题
  13. HTML学生个人网站作业设计:电影网站设计——橙色国外电影(13页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  14. 未来是现在的将来时,在社科院杜兰金融管理硕士项目酝酿灿烂的明天
  15. npm create vite@latest 失败
  16. cout与cerr区别
  17. VMware14 黑屏问题
  18. java 语音包_有人开发了马保国语音包
  19. hadoop1.2.1+zookeeper3.4.6+hbase0.94集群环境搭建
  20. 分布式文件系统FastDFS详解

热门文章

  1. 顺序的分数 Ordered Fractions [USACO 2.1]
  2. 计算机1为什么代表高电平,高电平为什么表示1,低电平为什么表示0?
  3. JsonParseException: Unexpected character (‘sss‘ (code xxx)): was expecting a colon to separ
  4. [转] 最火的42部美剧,练听力的不二之选
  5. 配置Web.config文件显示错误信息
  6. 京东登陆界面(静态)
  7. cmd命令查看路由器上记录的IP地址与MAC地址(ARP表)
  8. 南卫理公会计算机官网,南卫理工会大学
  9. 吴恩达深度学习课程值不值得学?四晚学完的高手给你建议
  10. easyexcel复杂表格---包含单元格合并,表格标题,以及自定义字段写入