加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【STemWin教程入门篇】第43章 EDIT-编辑控件

(2015-02-28 10:45:58)
标签:

ucos-iii

ucgui

emwin

dsp

edit

分类: emWin
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接

第43章  EDIT-编辑控件

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

43. 编辑控件介绍

43. 官方WIDGET_Edit实例

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

43. 总结

43.1  编辑控件介绍

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

【STemWin教程入门篇】第43章 <wbr>EDIT-编辑控件

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

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

【STemWin教程入门篇】第43章 <wbr>EDIT-编辑控件

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

【STemWin教程入门篇】第43章 <wbr>EDIT-编辑控件

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的使用。这个例子在模拟器中的位置:

【STemWin教程入门篇】第43章 <wbr>EDIT-编辑控件

源代码如下(官方的这个例子有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,将桌面窗口无效,从而执行重绘消息,并将编辑框显示出来。

实际显示效果如下:

【STemWin教程入门篇】第43章 <wbr>EDIT-编辑控件

43.3  对话框上使用编辑框控件

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

【STemWin教程入门篇】第43章 <wbr>EDIT-编辑控件

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

 【STemWin教程入门篇】第43章 <wbr>EDIT-编辑控件

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

#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. 设置浮点数显示。

实际的显示效果如下:

【STemWin教程入门篇】第43章 <wbr>EDIT-编辑控件

43.4  总结

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有