EMWIN
前言
EDIT 控件通常用来作为输入文本的主要用户界面,也可使用编辑字段以二进制、十进制或十六进制模式输入值。
一、 EDIT 控件简介
如下图
二、通知代码
列举出了 EDIT 小工具作为 WM_NOTIFY_PARENT 消息的一部分发送给其父窗口的消息类型:
WM_NOTIFICATION_CLICKED 已单击小工具。
WM_NOTIFICATION_RELEASED 已释放小工具。
WM_NOTIFICATION_MOVED_OUT已单击小工具,并且指针已移出小工具,但没有释放。
WM_NOTIFICATION_VALUE_CHANGED 编辑小工具的值(内容)已更改
三、键盘反应
如果小工具具有输入焦点,则它将对下列各键做出反应:
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
四、 EDIT 控件 API 函数
EDIT_AddKey() 按键输入例程。
EDIT_Create() 创建 EDIT 小工具。
EDIT_CreateAsChild() 创建 EDIT 小工具,作为子窗口。
EDIT_CreateEx() 创建 EDIT 小工具。
EDIT_CreateIndirect() 从资源表项创建 EDIT 小工具。
EDIT_CreateUser() 使用额外字节作为用户数据创建 EDIT 小工具。
EDIT_EnaBleBlink() 启用/禁用闪烁光标
EDIT_GetCursorCharPos() 返回光标位置的字符编号。
EDIT_GetCursorPixelPos() 返回光标的像素位置。
EDIT_GetDefaultBkColor() 返回默认背景颜色。
EDIT_GetDefaultFont() 返回默认的字体。
EDIT_GetDefaultTextAlign() 返回默认的文本对齐方式。
EDIT_GetDefaultTextColor() 返回默认文本颜色。
EDIT_GetFloatValue() 按浮点值返回当前值。
EDIT_GetNumChars() 返回给定编辑小工具的字符数。
EDIT_GetText() 获取用户输入。
EDIT_GetUserData() 检索用 EDIT_SetUserData()设置的数据。
EDIT_GetValue() 返回当前值。
EDIT_SetBinMode() 启用二进制编辑模式。
EDIT_SetBkColor() 设置编辑字段的背景色。
EDIT_SetCursorAtChar() 将编辑小工具光标设置到指定的字符位置。
EDIT_SetCursorAtPixel() 将编辑小工具光标设置到指定的像素位置。
EDIT_SetDecMode() 启用十进制编辑模式。
EDIT_SetDefaultBkColor() 设置默认背景色。
EDIT_SetDefaultFont() 设置用于编辑字段的默认字体。
EDIT_SetDefaultTextAlign() 设置编辑字段的默认文本对齐方式。
EDIT_SetDefaultTextColor() 设置默认文本颜色。
EDIT_SetFloatMode() 启用浮点编辑模式。
EDIT_SetFloatValue() 设置使用浮点编辑模式时的浮点值。
EDIT_SetFont() 选择文本的字体。
EDIT_SetHexMode() 启用十六进制编辑模式。
EDIT_SetInsertMode() 启用或禁用插入模式。
EDIT_SetMaxLen() 设置编辑字段的最大字符数。
EDIT_SetpfAddKeyEx() 设置添加字符时要调用的函数。
EDIT_SetSel() 设置当前选定内容。
EDIT_SetText() 设置文本。
EDIT_SetTextAlign() 设置编辑字段的文本对齐方式。
EDIT_SetTextColor() 设置文本的颜色。
EDIT_SetTextMode() 将小工具的编辑模式设置回文本模式。
EDIT_SetValue() 设置当前值。
EDIT_SetUlongMode() 启用不带符号的长十进制编辑模式。
EDIT_SetUserData() 设置 EDIT 小工具的额外数据。
GUI_EditBin() 编辑当前光标位置处的二进制值。
GUI_EditDec() 编辑当前光标位置处的十进制值。
GUI_EditHex() 编辑当前光标位置处的十六进制值。
GUI_EditString() 编辑当前光标位置处的字符串。
五、EDIT 控件演示例程
#include "editwinmode.h"
#include "GUI.h"
#include "WM.h"
#include "DIALOG.h"
#define WM_APP_SHOW_TEXT (WM_USER +0)
#define TEXT_MAXLEN 40
WM_HWIN DialoghWin;
//¶Ô»°¿ò×ÊÔ´±í
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] =
{
{
FRAMEWIN_CreateIndirect, "Framewin", 0, 55, 90, 200, 110, FRAMEWIN_CF_MOVEABLE},
{
EDIT_CreateIndirect, "Edit", GUI_ID_EDIT0, 24, 10, 145, 25, 0,15},
{
BUTTON_CreateIndirect,"Ok", GUI_ID_OK,65, 50, 70, 30}
};
//±³¾°´°¿ÚµÄ»Øµ÷º¯Êý
static void _BkCallback(WM_MESSAGE *pMsg)
{
static WM_HWIN hWin;
static WM_HWIN hEdit;
static U8 text;
char buffer[TEXT_MAXLEN];
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 (text)
{
hEdit=WM_GetDialogItem(DialoghWin,GUI_ID_EDIT0);/*¶ÁȡС¹¤¾ßµÄÈÎÎñ¾ä±ú*/
GUI_DispStringHCenterAt("The string you have modified is:", 160, 90);
EDIT_GetText(hEdit, buffer, TEXT_MAXLEN);
GUI_DispStringHCenterAt(buffer, 160, 110);
}
else
{
GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90);
}
break;
case WM_APP_SHOW_TEXT:/*µ±Ïò EDIT ¿Ø¼þÊäÈëÍê³É²¢ÇÒµã»÷¶Ô»°¿òÖеġ°OK¡±
°´Å¥ÒÔºó¾Í»áÏò±³¾°´°¿Ú WM_HBKWIN ·¢ËÍÏûÏ¢ WM_APP_SHOW_TEXT£¬*/
hWin=pMsg->hWinSrc;
WM_HideWindow(hWin); //Òþ²Ø¶Ô»°¿ò
text=1;
WM_InvalidateWindow(WM_HBKWIN); //±³¾°´°¿ÚÎÞЧ
WM_CreateTimer(WM_HBKWIN,0,3000,0);
break;
case WM_TIMER:
text=0;
WM_InvalidateWindow(WM_HBKWIN);
WM_ShowWindow(hWin);
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
//¶Ô»°¿ò»Øµ÷º¯Êý
static void _cbDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hItem;
int NCode;
int Id;
WM_MESSAGE Msg;
switch (pMsg->MsgId)
{
case WM_INIT_DIALOG:/*´´½¨¶Ô»°¿òºóÁ¢¼´·¢Ë͵½¶Ô»°¿ò´°¿Ú*/
//³õʼ»¯FRAMEWIN
hItem = pMsg->hWin;
FRAMEWIN_SetText(hItem, "EDIT USER");
FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
FRAMEWIN_SetFont(hItem, GUI_FONT_16B_ASCII);
//³õʼ»¯EDIT
hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_EDIT0);
EDIT_EnableBlink(hItem, 500, 1);/*ÆôÓÃ/½ûÓÃÉÁ˸¹â±ê*/
EDIT_SetText(hItem, "qichenxi");
EDIT_SetFont(hItem, &GUI_Font20_ASCII);
EDIT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
break;
case WM_NOTIFY_PARENT:/*¸æÖª¸¸´°¿Ú£¬Æä×Ó´°¿ÚÖз¢ÉúÁËijЩ¸Ä±ä*/
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(Id)
{
case GUI_ID_EDIT0: //EDIT¿Ø¼þ֪ͨÏûÏ¢
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
case WM_NOTIFICATION_VALUE_CHANGED:
break;
}
break;
case GUI_ID_OK:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
Msg.MsgId=WM_APP_SHOW_TEXT;
Msg.hWinSrc=pMsg->hWin;
WM_SendMessage(WM_HBKWIN,&Msg);/*Ïò´°¿Ú·¢ËÍÏûÏ¢¡£*/
break;
}
}
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
void Editwinmode_Demo(void)
{
WM_SetCallback(WM_HBKWIN,_BkCallback);
DialoghWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
while(1)
{
GUI_Delay(10);
}
}
这里我们没有做输入法,所以没办法在开发板上输入字符串,大家自行将本例程可以移植到模拟器中,在 PC 上模拟,通过键盘输入字符串,然后点击 OK 键,那么刚刚输入的字符串就会显示在背景窗口中
总结
仔细看一下代码和函数还是可以看懂的。