emWin(UCGUI)键盘输入(实体按键操作控件)

本期教程主要跟大家讲解键盘输入,这里我们通过开发板上面带的按键进行相关的操作,在后面会专门的做一期PS2键盘的教程。

描述

键盘输入设备使用ASCII字符编码,以便区分不同的字符。例如,键盘上只有一个“A”键,但大写的“A”与小写的“a”拥有不同的ASCII编码 (分别为0x41和0x61)

GUI_emWin 切换控件的焦点

驱动层API

键盘驱动层处理键盘消息函数。这些程序会在具体键(或组合键)被按下或松开时通知窗口管理器。
下表按字母顺序列出了驱动层键盘程序。详细描述如下。

UCGUN WM API 函数

基本函数

WM_CreateWindow() 创建一个窗口。
WM_CreateWindowAsChild() 创建一个子窗口。
WM_DeleteWindow() 删除一个窗口。
WM_Exec() 通过执行回调函数(所有工作)重绘有效窗口。
WM_Exec1() 通过执行一个回调函数(仅一个工作)重绘有效窗口。
WM_GetClientRect() 返回活动窗口的。
WM_GetDialogItem() 返回一个对话框项目(控件)的窗口句柄。
WM_GetOrgX() 返回活动窗口的原点 X 坐标。
WM_GetOrgY() 返回活动窗口的原点 Y 坐标。
WM_GetWindowOrgX() 返回一个窗口的原点 X 坐标。
WM_GetWindowOrgY() 返回一个窗口的原点 Y 坐标。
WM_GetWindowRect() 返回活动窗口的屏幕坐标。
WM_GetWindowSizeX() 返回一个窗口的水平尺寸(宽度)。
WM_GetWindowSizeY() 返回一个窗口的垂直尺寸(高度)。
WM_HideWindow() 使一个窗口不可见。
WM_InvalidateArea() 使显示屏的某些部分无效。
WM_InvalidateRect() 使一个窗口部分无效。
WM_InvalidateWindow() 使一个窗口无效。
WM_MoveTo() 设置一个窗口的坐标。
WM_MoveWindow() 移动一个窗口到另一个位置。
WM_Paint() 立即绘制或重绘一个窗口。
WM_ResizeWindow() 改变一个窗口尺寸。
WM_SelectWindow() 设置用于绘图操作的活动窗口。
WM_ShowWindow() 使一个窗口可见。

窗口管理器之回调机制

本期教程开始讲解STemWin的核心内容窗口管理器。通过这几期教程,大家应该明白最基本的窗口管理器知识。了解了这些基本的通信机制后,再学习控件的使用时,就会事半功倍。本期教程的内容主要来自官方手册,我这里只是将其总结一下,更详细的情况看英文版的手册。

BUTTON-按钮控件自定义回调函数,实现各种按钮效果

本章节为大家讲解按钮控件自定义回调函数,通过其回调函数就可以实现各种按钮效果。

初学者重要提示

1、很多时候,我们希望设计出不同效果的按钮出来,比如做一个音乐播放器界面将快进,快退,暂停,开始等都通过按钮来实现,这个时候时候按钮的自定义回调函数就派上用场了。

分享一种最简单的STemWin自定义控件实现方法

笔者把STemWin官方给的自定义控件demo进行了精简,得出了这个最简单的自定义控件实现方法,所有代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <string.h>
#include "GUI.h"
#include "WM.h"
typedef struct {
  char str[50];
} MYWIDGET_Obj;
static void _cbMyWidget(WM_MESSAGE * pMsg) {
  GUI_RECT WinRect;
  MYWIDGET_Obj MyWidget;
  switch (pMsg->MsgId) {
  case WM_PAINT:
    WM_GetWindowRectEx(pMsg->hWin, &WinRect);
    GUI_MoveRect(&WinRect, -WinRect.x0, -WinRect.y0);
    GUI_SetColor(GUI_YELLOW);
    GUI_Clear();
    WM_GetUserData(pMsg->hWin, &MyWidget, sizeof(MYWIDGET_Obj));
    if(MyWidget.str)
    {
        GUI_DispStringInRect(MyWidget.str, &WinRect, GUI_TA_HCENTER | GUI_TA_VCENTER);
    }
    break;
  }
}
WM_HWIN MYWIDGET_Create(int x0, int y0, int xSize, int ySize, WM_HWIN hWinParent, U32 Style, const char * pText) {
  WM_HWIN   hWin;
  MYWIDGET_Obj      MyWidget;
  if (pText) {
    strcpy(MyWidget.str,  pText);
  }
  hWin = WM_CreateWindowAsChild(x0, y0, xSize, ySize, hWinParent, Style, _cbMyWidget, sizeof(MYWIDGET_Obj));
  WM_SetUserData(hWin, &MyWidget, sizeof(MYWIDGET_Obj));
  return hWin;
}

代码的核心就是WM_CreateWindowAsChild这个函数,你把你的自定义控件的位置、大小、父窗口、回调函数、申请内存大小等传给它,它就在父窗口中创建你的自定义控件了。
MYWIDGET_Obj这个结构体就是你的自定义控件的数据结构,包含它需要用到的全局变量,这个例子我只写了一个字符串在里面。

操作系统发展史

什么是操作系统

可能很多人都会说,我们平时装的windows7 windows10都是操作系统,没错,他们都是操作系统。还有没有其他的?

想想我们使用的手机,Google公司的Android系统,Apple公司笔记本上的的MacOSX、IPhone的IOS,他们都是操作系统。

shell 判断文件夹或文件是否存在

文件夹不存在则创建

1
2
3
4
5
if [ ! -d "/data/" ];then
mkdir /data
else
echo "文件夹已经存在"
fi

文件存在则删除

1
2
3
4
5
if [ ! -f "/data/filename" ];then
echo "文件不存在"
else
rm -f /data/filename
fi

判断文件夹是否存在

1
2
3
4
5
if [ -d "/data/" ];then
echo "文件夹存在"
else
echo "文件夹不存在"
fi

判断文件是否存在

shell定时自动备份网站文件

脚本作用

定时备份网站/home/www/htdocs/blog/home/www/backup/site-blog下,
并删除10天前的备份。

创建脚本

1
vi /home/www/shell/site_backup_blog.sh

脚本内容