在当今这个图形界面盛行的时代,掌握图形界面编程技巧变得尤为重要。emwin,作为嵌入式GUI(Graphical User Interface,图形用户界面)库之一,因其高性能和易于使用而受到广泛欢迎。本文将带你从新手入门到实战案例,轻松掌握emwin图形界面编程技巧。
初识emwin
什么是emwin?
emwin是一款由德国 SEGGER Microcontroller 公司开发的嵌入式GUI库,广泛应用于工业控制、智能家居等领域。它具有以下特点:
- 高性能:支持多种图形显示设备,包括TFT、STN、LCD等。
- 易于使用:提供丰富的API函数和示例代码,简化开发过程。
- 功能丰富:支持多种控件,如按钮、文本框、菜单、列表等。
emwin的应用场景
emwin适用于以下场景:
- 工业控制:如工控机、PLC、机器人等。
- 智能家居:如智能电视、智能音响、智能家电等。
- 医疗设备:如监护仪、医疗诊断设备等。
emwin新手教程
1. 环境搭建
首先,你需要下载emwin的源代码,并配置好开发环境。以下以Keil uVision为例:
- 下载emwin源代码。
- 将源代码添加到Keil uVision项目中。
- 配置工程选项,如目标芯片、时钟频率等。
2. 初步了解emwin结构
emwin主要由以下几个部分组成:
- 图形设备接口:负责图形显示和输入。
- 窗口管理器:负责窗口的创建、显示、隐藏等操作。
- 控件:如按钮、文本框、菜单等。
- 事件处理:处理用户输入,如点击、触摸等。
3. 编写第一个emwin程序
以下是一个简单的emwin程序示例:
#include "GUI.h"
void MainTask(void) {
GUI_Init();
GUI_SetBkColor(GUI_BLACK);
GUI_Clear();
// 创建一个按钮
BUTTON CreateButton(int x, int y, int w, int h, const char* text) {
BUTTON button;
button = BUTTON_CreateEx(x, y, w, h, 0, GUI_ID_BUTTON_0, GUI_COUNTOF(GUI_CF_DEFAULT), 0, GUI_TA_CENTER, 0, text);
GUI_BringToFront(button);
return button;
}
// 添加按钮到窗口
BUTTON_AddButton(GUI_CreateWindow(GUI_ID_WINDOW_0, 0, 0, 240, 320, "", 0, 0, 0));
// 显示窗口
GUI_WindowShow(GUI_ID_WINDOW_0);
// 循环处理事件
while(1) {
GUI_Exec();
GUI_Delay(10);
}
}
int main(void) {
MainTask();
return 0;
}
emwin实战案例
1. 实现一个简单的仪表盘
以下是一个简单的仪表盘程序示例:
#include "GUI.h"
#include "DIALOG.h"
#include "WM.h"
#include "TEXT.h"
#include "PROGBAR.h"
// 仪表盘界面
static WIDGET createIndicators(WIDGET *parent) {
return PROGBAR_CreateEx(10, 10, 220, 80, parent, GUI_ID_PROGRESSBAR_0, 0, 100, 0);
}
// 仪表盘程序
static void _cb_indicators(WM_MESSAGE *pMsg) {
WIDGET *pIndicators;
switch (pMsg->MsgId) {
case WM_CREATE:
pIndicators = createIndicators(pMsg->hWin);
break;
case WM_PAINT:
PROGBAR_SetValue(pIndicators, 10);
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
void MainTask(void) {
GUI_Init();
GUI_SetBkColor(GUI_BLACK);
GUI_Clear();
DIALOG CreateDialog(pMsg, 0, 0, 240, 320, 0, 0, 0, GUI_ID_DIALOG_0, 0);
Dialog_AddPage(&CreateDialog, _cb_indicators, GUI_ID_INDICATORS_0, 0, "Indicators");
// 显示窗口
GUI_WindowShow(GUI_ID_DIALOG_0);
// 循环处理事件
while (1) {
GUI_Exec();
GUI_Delay(10);
}
}
int main(void) {
MainTask();
return 0;
}
2. 实现一个简单的音乐播放器
以下是一个简单的音乐播放器程序示例:
#include "GUI.h"
#include "BUTTON.h"
#include "TEXT.h"
#include "PROGBAR.h"
// 播放器界面
static WIDGET createMusicPlayer(WIDGET *parent) {
BUTTON CreateButton(int x, int y, int w, int h, const char* text) {
BUTTON button;
button = BUTTON_CreateEx(x, y, w, h, 0, GUI_ID_BUTTON_0, GUI_COUNTOF(GUI_CF_DEFAULT), 0, GUI_TA_CENTER, 0, text);
GUI_BringToFront(button);
return button;
}
TEXT CreateText(int x, int y, int w, int h, const char* text) {
TEXT textWidget;
textWidget = TEXT_CreateEx(x, y, w, h, parent, GUI_ID_TEXT_0, 0, GUI_TA_LEFT, 0, text);
GUI_BringToFront(textWidget);
return textWidget;
}
// 创建按钮和文本
CreateButton(10, 10, 80, 40, "Play");
CreateButton(100, 10, 80, 40, "Pause");
CreateText(10, 60, 210, 40, "Playing music...");
// 创建进度条
PROGBAR CreateProgressBar(int x, int y, int w, int h, int maxValue, int value, WIDGET *parent) {
PROGBAR progressBar;
progressBar = PROGBAR_CreateEx(x, y, w, h, parent, GUI_ID_PROGRESSBAR_0, 0, maxValue, 0, 0);
PROGBAR_SetValue(progressBar, value);
return progressBar;
}
CreateProgressBar(10, 110, 210, 20, 100, 10, pMsg->hWin);
return pMsg->hWin;
}
// 播放器程序
static void _cb_musicPlayer(WM_MESSAGE *pMsg) {
switch (pMsg->MsgId) {
case WM_CREATE:
createMusicPlayer(pMsg->hWin);
break;
case WM_PAINT:
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
void MainTask(void) {
GUI_Init();
GUI_SetBkColor(GUI_BLACK);
GUI_Clear();
DIALOG CreateDialog(pMsg, 0, 0, 240, 320, 0, 0, 0, GUI_ID_DIALOG_0, 0);
Dialog_AddPage(&CreateDialog, _cb_musicPlayer, GUI_ID_MUSICPLAYER_0, 0, "Music Player");
// 显示窗口
GUI_WindowShow(GUI_ID_DIALOG_0);
// 循环处理事件
while (1) {
GUI_Exec();
GUI_Delay(10);
}
}
int main(void) {
MainTask();
return 0;
}
总结
通过本文的学习,相信你已经对emwin图形界面编程有了初步的了解。在实际应用中,你可以根据需求调整界面布局和功能。希望本文能帮助你轻松掌握emwin图形界面编程技巧。
