STM32——EMWIN BUTTON 控件显示位图(十五)

EMWIN

前言

有时候我们希望在按钮上显示一些图片以区分打开和关闭,比如上一小节中打开 LED,使用 emwin 自带的 BUTTON 控件的时候打开和关闭 LED 时 BUTTON 的状态都是一样的,不能很只管的判断出此时 LED 灯的状态,需要我们去查看 LED 的亮灭才能判断。emwin 提供了在 BUTTON 上显示位图的 API 函数,那么我们就可以在打开和关闭的时候通过显示不同的位图来区分开、关这两种状态

一、制作位图 C 文件

首先我们肯定需要制作两个位图文件,当关闭的时候我们在 BUTTON 上显示图 14.6.1 所示图片,打开的时候显示图 14.6.2 所示图片,这两种图片的格式均为 BMP。
在这里插入图片描述
怎么生成.c文件看之前的博客就可以了。

二、GUIBulider 设计界面

在这里插入图片描述
用 GUIBulider 设计出的界面中使用了一个我们还没有用过的控件:TEXT,我们用 TEXT 控件显“LED1:”和“BEEP:”这两个提示信息。图中的按钮还是使用的 emwin默认的按钮类型,要想修改为位图就需要修改生成的 C 文件,注意:BUTTON 控件上没有显示字符,GUIBulider 只是生成一个大体的程序框架而已
在这里插入图片描述
在 buttonbmp.c 文件就是将前面生成的那两个位图 C 文件复制到一个 C 文件里面buttonbmp.h 文件主要是声明了两个 GUI_BITMAP 结构体变量:bmBUTTONOFF 和bmBUTTONON,这样我们就可以在其他文件中调用这两个结构体变量,可以简单的理解为这两个结构体变量就是图片 OFF 和 ON。

#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_BUTTON_0 (GUI_ID_USER + 0x01)
#define ID_BUTTON_1 (GUI_ID_USER + 0x02)
#define ID_TEXT_0 (GUI_ID_USER + 0x03)
#define ID_TEXT_1 (GUI_ID_USER + 0x04)
GUI_BITMAP buttonbmp_tab[2];
//对话框资源表
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = 
{
{ FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 800, 480, 0, 0x64, 0 },
{ BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 350, 122, 110, 40, 0, 0x0, 0 },
{ BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 350, 251, 110, 40, 0, 0x0, 0 },
{ TEXT_CreateIndirect, "Text", ID_TEXT_0, 266, 132, 80, 20, 0, 0x64, 0 },
{ TEXT_CreateIndirect, "Text", ID_TEXT_1, 266, 261, 80, 20, 0, 0x64, 0 },
};
//对话框回调函数
static void _cbDialog(WM_MESSAGE * pMsg) 
{
WM_HWIN hItem;
int NCode;
int Id;
static u8 ledflag=0;
static u8 beepflag=0;
switch (pMsg->MsgId) 
{
case WM_PAINT: (1)
GUI_SetBkColor(GUI_WHITE);
GUI_Clear();
break;
case WM_INIT_DIALOG:
//初始化对话框
hItem = pMsg->hWin;
FRAMEWIN_SetTitleHeight(hItem, 30);
FRAMEWIN_SetText(hItem, "ALIENTEK BUTTONBMP DISP");
FRAMEWIN_SetFont(hItem, GUI_FONT_24_ASCII);
FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
FRAMEWIN_SetTextColor(hItem, 0x0000FFFF);
//初始化 BUTTON0
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
BUTTON_SetBitmapEx(hItem,0,&buttonbmp_tab[0],0,0); (2)
BUTTON_SetText(hItem, "");
//初始化 BUTTON1
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
BUTTON_SetBitmapEx(hItem,0,&buttonbmp_tab[0],0,0); (3)
BUTTON_SetText(hItem, "");
//初始化 TEXT0
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
TEXT_SetFont(hItem, GUI_FONT_32_ASCII);
TEXT_SetText(hItem, "LED1:");
//初始化 TEXT1
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
TEXT_SetFont(hItem, GUI_FONT_32_ASCII);
TEXT_SetText(hItem, "BEEP:");
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(Id) 
{
case ID_BUTTON_0: //BUTTON_0 的通知代码,控制 LED1
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
switch(NCode) 
{
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED: //按钮被按下并释放
LED1=~LED1; //LED1 反转
ledflag=~ledflag;
BUTTON_SetBitmapEx(hItem,0,ledflag?\ (4)
&buttonbmp_tab[1]:&buttonbmp_tab[0],0,0);
break;
}
break;
case ID_BUTTON_1: //BUTTON_1 的通知代码,控制 BEEP
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
switch(NCode) 
{
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
BEEP=~BEEP; //蜂鸣器反转
beepflag=~beepflag;
BUTTON_SetBitmapEx(hItem,0,beepflag?\ (5)
&buttonbmp_tab[1]:&buttonbmp_tab[0],0,0);
break;
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
break;
} }
//创建一个对话框
WM_HWIN CreateFramewin(void) 
{
WM_HWIN hWin;
buttonbmp_tab[0]=bmBUTTONOFF;
buttonbmp_tab[1]=bmBUTTONON;
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate)\
, _cbDialog, WM_HBKWIN, 0, 0);
return hWin;
}
//BUTTON 按钮上显示位图
void Buttonbmp_Demo(void)
{
WM_HWIN hWin;
hWin=CreateFramewin();
while(1)
{
GUI_Delay(100);
} }

(1)、WM_PAINT 消息,使用 GUIBulider 生成的 C 文件中没有这个消息,这里需要我们手动添加进去,当接收到 WM_PAINT 消息的时候就将对话框的背景色刷新为白色。
(2)、初始化 BUTTON0 的时候调用函数 BUTTON_SetBitmapEx()在 BUTTON 上显示位图OFF。
(3)、初始化 BUTTON1 的时候调用函数 BUTTON_SetBitmapEx()在 BUTTON 上显示位图OFF。
(4)、根据 ledflag 的不同调用函数 BUTTON_SetBitmapEx()在 BUTTON 上显示 OFF 或者ON。
(5)、根据 beepflag 的不同调用函数 BUTTON_SetBitmapEx()在 BUTTON 上显示 OFF 或者ON。
在这里插入图片描述
点击 LED1 和 BEEP 的开关,显示如图 14.6.9 所示,并且 LED1 点亮,蜂鸣器响。
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F4是一款高性能的单片机系列,它内置了强大的ARM Cortex-M4内核,具有丰富的外设和高速的处理能力,非常适合用于开发各种嵌入式应用。 emWin是一款专业的嵌入式图形库,它可以在STM32F4上运行,提供了丰富的图形显示和用户界面功能。通过使用emWin,我们可以轻松地实现各种图形界面设计,包括示波器的功能。 示波器是一种常用的测试设备,用于显示电压信号的变化情况。在STM32F4上使用emWin图形库,可以实现一个简单的示波器应用程序。首先,我们可以通过ADC模块获取外部信号的电压值。然后,使用emWin中的绘图函数将这些电压值显示在屏幕上,形成波形图。同时,我们还可以使用触摸屏或按键等输入设备,实现一些调整功能,比如改变波形的时间尺度或幅度,以及选择不同的输入通道等。此外,我们还可以添加触发功能,使波形在特定条件下触发显示,以便更好地观察信号。 要实现STM32F4上的emWin示波器,首先需要了解STM32F4的硬件架构和外设功能。然后,使用STM32CubeMX工具进行初始化设置,并在开发环境中编写相应的代码。在编写代码时,我们需要使用emWin提供的绘图函数和用户界面库函数,来实现波形的绘制和交互功能。 总之,使用STM32F4和emWin图形库,我们可以很方便地实现一个功能强大的示波器应用程序。这个示波器可以用于各种测试和测量应用,是嵌入式系统开发中非常有用的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我与nano

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值