winedit使用教程_【STemWin教程入门篇】第43章 EDIT-编辑控件
第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-编辑控件相关推荐
- Android开发 入门篇(二) - 常用UI控件
文章目录 控件 Button TextView EditText ImageView ProgressBar AlertDialog ProgressDialog 布局 LenearLayout an ...
- 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第三章:简单控件
第 3 章 简单控件 本章介绍了App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图.容纳视图的常用布局.响应点击的按钮控件.显示图片的图像视图等.然后结合本章所学的知识,演示了一个实战项 ...
- SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 SAP UI5 表格控件使用方法介绍试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- SAP UI5 应用开发教程之六十五 - 基于 OData V4 的 SAP UI5 表格控件如何实现创建,编辑和保存功能
本教程前几个步骤,我们已经用 SAP UI5 table 控件开发了一个包含 User 列表的应用,并且支持了根据 LastName 字段进行查询,以及排序的操作. SAP UI5 应用开发教程之六十 ...
- SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能
本教程的上一个步骤,我们学习了如何基于 OData V4 开发一个最简单的使用了 Table(表格)控件的 SAP UI5 应用. SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 ...
- R语言学习笔记——入门篇:第一章-R语言介绍
R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...
- C语言入门——《明解C语言》入门篇第四章练习
新开C语言专栏整理一下学C的艰苦之路,先从看书+视频开始. 整理了<明解C语言>入门篇第四章练习的"参考答案",记录一下学习的过程.直接上代码. 练习4-1 int m ...
最新文章
- 计算机专业的第二批本科大学,我校22个专业入选第二批一流本科专业建设“双万计划”...
- python flask源码解析_用尽洪荒之力学习Flask源码
- MyISAM与InnoDB的索引实现
- WriteFile写UNICODE字符串 TxT显示乱码
- tengine安装问题
- mapper里面select id 后面一直红名_YTG晨晨改ID“进厂找班上了”,如此自嘲,心态还挺好...
- 阿里AI解锁车场景:达摩院技术输出,天猫精灵进驻奔驰、奥迪和沃尔沃
- 从城市到矿山!成都睿铂与Microdrones 海外三维建模案例
- SQLSERVER 函数大全
- 下列哪种不是python元组的定义方式_python笔试题
- warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
- BURP安装Turbo Intruder插件报错问题
- HTML学生个人网站作业设计:电影网站设计——橙色国外电影(13页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
- 未来是现在的将来时,在社科院杜兰金融管理硕士项目酝酿灿烂的明天
- npm create vite@latest 失败
- cout与cerr区别
- VMware14 黑屏问题
- java 语音包_有人开发了马保国语音包
- hadoop1.2.1+zookeeper3.4.6+hbase0.94集群环境搭建
- 分布式文件系统FastDFS详解
热门文章
- 顺序的分数 Ordered Fractions [USACO 2.1]
- 计算机1为什么代表高电平,高电平为什么表示1,低电平为什么表示0?
- JsonParseException: Unexpected character (‘sss‘ (code xxx)): was expecting a colon to separ
- [转] 最火的42部美剧,练听力的不二之选
- 配置Web.config文件显示错误信息
- 京东登陆界面(静态)
- cmd命令查看路由器上记录的IP地址与MAC地址(ARP表)
- 南卫理公会计算机官网,南卫理工会大学
- 吴恩达深度学习课程值不值得学?四晚学完的高手给你建议
- easyexcel复杂表格---包含单元格合并,表格标题,以及自定义字段写入