这是什么电影????https www小电影://www.yidianzixun.com/article/V_0

百度百科_全球最大中文百科全书
清除历史记录关闭
湾鳄是当今世界上体型最大的鳄鱼,成年湾鳄体重能达到1.6吨,他们咬合力惊人,不仅能猎杀野牛,连海龟也不在话下。
大陆漂移说让我们都知道现在所有的大陆原来都连在一起,而现在这些大陆依然在缓慢的移动着,以致于影响到GPS系统。
加勒比群岛中的ABC群岛,依托丰沛的石油资源在荷兰海外属地中有着重要地位,最近却饱受委内瑞拉反殖民主义的影响。
在中国和日本之间,曾经有过一个小小的缓冲国琉球。这个中国眼中的蕞尔小国,在日本看来则是一块肥肉。
非洲东部地区出现了更深层次的裂痕,最终的结果是将非洲大陆分隔为东西两部分,形成一块真正意义上的“新大陆”。
1996年,19岁的工人宋学文在上班途中捡到一个疑似钥匙链的金属条。他只是揣着金属链9个小时,就毁了他的一生。
位于意大利的埃特纳火山是欧洲海拔最高的活火山,观测显示这座火山正缓慢的滑入地中海,有可能带来海啸等灾难。
“富二代”如今并不算一个好词,但在抗战期间,中国涌现出了一批爱国的“富二代”,为了守护中国的蓝天贡献出了生命。
谈论星座如今已经成为一个有趣的时尚话题,人类对星空的探问由来已久,观测星空是人类迈出认识世界的第一步。
让人类平等地认知世界
00,000,000
章鱼已经被证明有较高的智慧,而这一切跟它蓝色的血液也有紧密的关系。
一口现代的工业油井,让饱受捕杀的鲸鱼们逃过一劫。
历史上的今天
想跟他/她PK吗?
功能即将开启…
最有温度的校园公益知识团队
29万燃梦计划成员
896万词条贡献
覆盖2430所高校
词条 | 特色词条
想跟他/她PK吗?
功能即将开启…
最核心的贡献者
精英 协作 分享
更多权力 更多职责
共271个蝌蚪
词条 | 特色词条
百科权威专家
想跟他/她PK吗?
功能即将开启…
百科权威专家
最权威的专家团队
超过800名权威专家
审核编辑近9万词条
共覆盖12个领域
罗云波教授
词条 | 特色词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&编辑&&词条
&参与&&任务
&参与&&任务
&参与&&任务
&参与&&任务
&参与&&任务
&参与&&任务
&在商城兑换得到&
&在商城秒杀得到&
&在商城兑换得到&
&在商城秒杀得到&
&在商城秒杀得到&
&编辑&&词条
&在商城秒杀得到&
百度百科是众人参与可协作的网络百科全书,无论是创建词条、编辑现有词条,您都可以亲手为百度百科作出贡献。
携手最具影响力的中文知识平台,用知识的价值提升品牌的价值。针对不同类型的权威机构提供丰富的合作模式,开展基于知识传播的公益合作,强势展现合作方优质资源,提升品牌影响力。这个背景音乐是什么 http://www.yidianzixun.com/n/V_00Oqzb22?s=9&appid=xiaomi&ver=3.7.0&utk=070ea15l_百度知道
这个背景音乐是什么 http://www.yidianzixun.com/n/V_00Oqzb22?s=9&appid=xiaomi&ver=3.7.0&utk=070ea15l
我有更好的答案
Koko Soko来自 Smile. DK
采纳率:93%
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。MF47万用表原理与安装_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
MF47万用表原理与安装
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
还剩31页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢【emWin实战教程V2.0】第47章&BUTTON-按钮控件自定义回调函数,实现各种按钮效果_硬汉Eric2013_新浪博客
【emWin实战教程V2.0】第47章&BUTTON-按钮控件自定义回调函数,实现各种按钮效果
安富莱电子
微信号:armfly_com​
完整65章+12章附件教程下载地址:
第47章&&&&&&&BUTTON-按钮控件自定义回调函数,实现各种按钮效果
本章节为大家讲解按钮控件自定义回调函数,通过其回调函数就可以实现各种按钮效果。这方面的问题也是经常有初学者问,所以专门做一期教程。
47.1&初学者重要提示
47.2&按钮控件自定义回调函数的实现方法
47.3&官方WIDGET_ButtonRound.c实例讲解
47.4&实验例程说明(RTOS)
47.5&实验例程说明(裸机)
47.1&&初学者重要提示
1、很多时候,我们希望设计出不同效果的按钮出来,比如做一个音乐播放器界面将快进,快退,暂停,开始等都通过按钮来实现,这个时候时候按钮的自定义回调函数就派上用场了。希望初学者掌握这个重要的知识点。不仅仅是按钮控件,后面要讲解到的其它控件都是可以设置自定义回调函数。
2、按钮控件的所有API函数在emWin手册中都有讲解,下图是中文版手册里面API函数位置:
下图是英文版手册里面API函数的位置:
47.2&按钮控件自定义回调函数的实现方法
按钮控件的本质也是窗口,所以也是有回调函数的,只是被封装了,用户看不到,不像我们使用窗口或者框架窗口的时候还需要专门的设置回调函数。
实现自定义回调函数的关键就是函数WM_SetCallback,通过这个函数就可以重定向按钮的回调函数,从而也就可以实现各种效果的按钮。下面我们通过一个实例给大家介绍如何实现按钮控件的自定义回调函数。完整代码在例子V6-563_STemWin实验_Button按钮控通过自定义回调函数实现各种按钮效果(模拟器)里面:
#include "DIALOG.h"
static GUI_CONST_STORAGE unsigned long _acpic1[]
&0xFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFF000000,
0xFFxFF000000,
GUI_CONST_STORAGE GUI_BITMAP bmpic1 = {
& 64, // xSize
& 64, // ySize
BytesPerLine
BitsPerPixel
& (unsignedchar *)_acpic1,
&// Pointer to picture
// Pointer to palette
&GUI_DRAW_BMP8888
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_BUTTON_0&&
(GUI_ID_USER + 0x01)
#define ID_BUTTON_1&&
(GUI_ID_USER + 0x02)
static const GUI_WIDGET_CREATE_INFO_aDialogCreate[]
& {FRAMEWIN_CreateIndirect, "Framewin",
ID_FRAMEWIN_0, 0, 0, 800, 480,0, 0x64, 0 },
{BUTTON_CreateIndirect,&&"",&&&&&&&&
ID_BUTTON_0,30, 30, 64, 64, 0, 0x0, 0 },
{BUTTON_CreateIndirect,&&"",&&&&&&&&
ID_BUTTON_1,30, 120, 120, 40, 0, 0x0, 0 },
static void _cbButton(WM_MESSAGE * pMsg)
//--------------(3)
WM_HWIN& hW
hWin& = pMsg-&hW
switch(pMsg-&MsgId)
caseWM_PAINT:
&&&&&&&&&&&&&
if(BUTTON_IsPressed(hWin))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_WHITE);
&&&&&&&&&&&&&&&&&&
GUI_Clear();
&&&&&&&&&&&&&&&&&&
GUI_SetAlpha(0xb0);
&&&&&&&&&&&&&&&&&&
GUI_DrawBitmap(&bmpic1,0,0);
&&&&&&&&&&&&&&&&&&
GUI_SetAlpha(0);&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_DrawBitmap(&bmpic1,0,
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
BUTTON_Callback(pMsg);
static void _cbButton1(WM_MESSAGE * pMsg)
&//--------------(6)
WM_HWIN& hW
hWin& = pMsg-&hW
switch(pMsg-&MsgId)
caseWM_PAINT:
&&&&&&&&&&&&&
WM_GetClientRect(&Rect);
&&&&&&&&&&&&&
if(BUTTON_IsPressed(hWin))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_DARKGRAY);
&&&&&&&&&&&&&&&&&&
GUI_FillRoundedRect(Rect.x0,Rect.y0, Rect.x1, Rect.y1,
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_DARKGRAY);
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_WHITE);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_LIGHTBLUE);
&&&&&&&&&&&&&&&&&&
GUI_FillRoundedRect(Rect.x0,Rect.y0, Rect.x1, Rect.y1,
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_LIGHTBLUE);
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_WHITE);&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
GUI_SetFont(&GUI_Font16_ASCII);
&&&&&&&&&&&&&
GUI_DispStringInRect("LED1",&Rect, GUI_TA_HCENTER |
GUI_TA_VCENTER);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
BUTTON_Callback(pMsg);
static void _cbDialog(WM_MESSAGE * pMsg)
switch(pMsg-&MsgId)
caseWM_INIT_DIALOG:
&&&&&&&&&&&&&
&&&&&&&&&&&&&
//初始化框架窗口
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem= pMsg-&hW
&&&&&&&&&&&&&
FRAMEWIN_SetFont(hItem,GUI_FONT_32B_ASCII);
&&&&&&&&&&&&&
FRAMEWIN_SetTextAlign(hItem,GUI_TA_HCENTER |
GUI_TA_VCENTER);
&&&&&&&&&&&&&
FRAMEWIN_SetText(hItem,"armfly");
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
//初始化按钮控件
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem= WM_GetDialogItem(pMsg-&hWin,
ID_BUTTON_0);
&&&&&&&&&&&&&
WM_SetHasTrans(hItem);&&&&&&&&&&&&
//--------------(1)
&&&&&&&&&&&&&
WM_SetCallback(hItem,_cbButton);&
//--------------(2)
&&&&&&&&&&&&&
&&&&&&&&&&&&&
//初始化按钮控件
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem= WM_GetDialogItem(pMsg-&hWin,
ID_BUTTON_1);
&&&&&&&&&&&&&
WM_SetHasTrans(hItem);&&&&&&&&&&&&
//--------------(4)
&&&&&&&&&&&&&
WM_SetCallback(hItem,_cbButton1);
//--------------(5)
&&&&&&&&&&&&&
caseWM_NOTIFY_PARENT:
&&&&&&&&&&&&&
WM_GetId(pMsg-&hWinSrc);
&&&&&&&&&&&&&
NCode= pMsg-&Data.v;
&&&&&&&&&&&&&
switch(Id)
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
caseID_BUTTON_0:
&&&&&&&&&&&&&&&&&&&&&&
switch(NCode)
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
caseWM_NOTIFICATION_CLICKED:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
caseWM_NOTIFICATION_RELEASED:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
WM_DefaultProc(pMsg);
*********************************************************************************************************
数名: CreateFramewin
*&&&&功能说明:&创建对话框&&&&&&&
*&&&&形&&&&参:无
回值:&返回对话框句柄
*********************************************************************************************************
WM_HWIN CreateFramewin(void) {
& WM_HWINhW
=GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate),
_cbDialog,WM_HBKWIN, 0, 0);
& returnhW
void MainTask(void)
GUI_Init();
WM_SetCreateFlags(WM_CF_MEMDEV);
CreateFramewin();
GUI_Delay(10);
这个例子在对话框上创建了2个按钮控件,每个按钮都重新设置了回调函数,实现了两种不同的按钮效果,一个是图标按钮,另一个是扁平化效果的按钮。
1.&&&&&通过函数WM_SetHasTrans设置ID为ID_BUTTON_0的按钮控件的透明效果,调用了这个函数有什么用呢?通过这个函数就可以将按钮回调函数中WM_PAINT消息没有重绘到的区域显示为完全透明,比如我们在按钮控件回调函数的WM_PAINT消息里面绘制了一个填充的圆圈,那么按钮控件所在区域的圆圈以外部分就是完全透明的。
2.&&&&&通过函数WM_SetCallback重新设置ID为ID_BUTTON_0的按钮控件的回调函数。
3.&&&&&通过此回调函数就可以设置各种效果的按钮了,这里是将按钮设置成一个图标。这个回调函数只有两个消息,一个是WM_PAINT,一个是默认的default,也就是说除了WM_PAINT消息以外,其它所有消息还是使用按钮控件默认的回调处理机制BUTTON_Callback来实现。这个问题解释清楚了,剩下就是WM_PAINT消息里面实现的功能了,这个消息里面实现了按钮按下和未按下两种状态的显示效果,通过函数BUTTON_IsPressed来区分这两种状态,返回1就是按下了,返回0就是未按下。
if (BUTTON_IsPressed(hWin))
GUI_SetBkColor(GUI_WHITE);
GUI_Clear();
GUI_SetAlpha(0xb0);
GUI_DrawBitmap(&bmpic1,0,0);
GUI_SetAlpha(0);&&&&&&
GUI_DrawBitmap(&bmpic1,0,
通过上面的代码就实现了按钮未按下时显示的是一个图标,按下时是一个有透明效果的图标。
4.&&&&&通过函数WM_SetHasTrans设置ID为ID_BUTTON_1的按钮控件的透明效果。
5.&&&&&通过函数WM_SetCallback重新设置ID为ID_BUTTON_1的按钮控件的回调函数。
6.&&&&&通过此回调函数就可以设置各种效果的按钮了,这里是将按钮设置成圆角矩形。这里我们重点看WM_PAINT消息,其它跟第3条讲解的是一样的。
WM_GetClientRect(&Rect);
if (BUTTON_IsPressed(hWin))
GUI_SetColor(GUI_DARKGRAY);
GUI_FillRoundedRect(Rect.x0,Rect.y0, Rect.x1, Rect.y1,
GUI_SetBkColor(GUI_DARKGRAY);
GUI_SetColor(GUI_WHITE);
GUI_SetColor(GUI_LIGHTBLUE);
GUI_FillRoundedRect(Rect.x0,Rect.y0, Rect.x1, Rect.y1,
GUI_SetBkColor(GUI_LIGHTBLUE);
GUI_SetColor(GUI_WHITE);&&
GUI_SetFont(&GUI_Font16_ASCII);
GUI_DispStringInRect("LED1",
&Rect,GUI_TA_HCENTER | GUI_TA_VCENTER);
通过上面的代码就实现了按钮未按下和按下时两种不同的按钮颜色。实际显示效果如下,分辨率800*480:
通过学习这个实例,建议大家尝试设置各种其它的按钮显示效果。
47.3&官方WIDGET_ButtonRound.c实例讲解
这个DEMO在模拟器中的位置:
主要功能介绍:
这个例子演示了按钮自定义回调函数的实现,通过其回调函数实现了一个圆形的按钮,由于是官方做的例子,所以细节的处理上更专业些。学习这个例子前务必先学习前面47.2小节的讲解。
程序代码如下:
#include "WM.h"
#include "FRAMEWIN.h"
#include "BUTTON.h"
// Recommended memory to run thesample with adequate
performance
#define RECOMMENDED_MEMORY (1024L * 5)
static int _C
static int _F
static int _P
static const GUI_WIDGET_CREATE_INFO_aDialogCreate[] =
& {FRAMEWIN_CreateIndirect, "Round button
50,&60, 200, 120, FRAMEWIN_CF_MOVEABLE
{BUTTON_CreateIndirect,&&"Button",&&GUI_ID_BUTTON0,&&
100,& 10,&80,&
BUTTON_CreateIndirect,&&
"Callback",
GUI_ID_BUTTON1,&&&
10,&10,& 60,& 20
{BUTTON_CreateIndirect,&&"Font",&&&&GUI_ID_BUTTON2,&&&
10,& 30,&60,& 20
{BUTTON_CreateIndirect,&&"Color",&&&GUI_ID_BUTTON3,&&&
10,& 50,&60,& 20
{BUTTON_CreateIndirect,&&"Cancel",&&GUI_ID_CANCEL,&&&&
10,& 70,&60,& 20
static void _OnPaint(BUTTON_Handle hObj) {
//--------------(1)
& charac[50];
& GUI_RECTR
& Index =(WIDGET_GetState(hObj)
& BUTTON_STATE_PRESSED) ? 1 : 0;
//--------------(2)
&WM_GetClientRect(&Rect);
&// Draw filled ellipse with button
background color
&GUI_SetColor(BUTTON_GetBkColor(hObj,
&&GUI_FillEllipse(Rect.x1/
2, Rect.y1 / 2, Rect.x1 / 2, Rect.y1 / 2);
&// Draw black shape
&GUI_SetColor(GUI_BLACK);
&GUI_DrawEllipse(Rect.x1 / 2, Rect.y1 /
2, Rect.x1 / 2, Rect.y1 / 2);
&// Draw button text with widget
attributes
&GUI_SetColor(BUTTON_GetTextColor(hObj,
&GUI_SetBkColor(BUTTON_GetBkColor(hObj,
&GUI_SetFont(BUTTON_GetFont(hObj));
&BUTTON_GetText(hObj, ac,
sizeof(ac));
& if(_Pressed)
{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//--------------(3)
strcpy(ac+ strlen(ac), "\npressed");
&GUI_DispStringInRect(ac,
&Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);
static void _cbButton(WM_MESSAGE * pMsg)
//--------------(4)
& switch(pMsg-&MsgId)
caseWM_PAINT:&&&&&&&&&&&&&&&&&&&&&&&&&
//--------------(5)
&&&&&_OnPaint(pMsg-&hWin);
default:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//--------------(6)
&&&&&BUTTON_Callback(pMsg);
// The original callback
& if(pMsg-&MsgId ==
{&&&&&&&&&&
//--------------(7)
if(BUTTON_IsPressed(pMsg-&hWin)) {
if(!_Pressed) {
&&&&&&&_Pressed
&&&&&_Pressed
static void _cbDialog(WM_MESSAGE * pMsg) {
int&&&&&&&&&&
int&&&&&&&&&&
&WM_HWIN&&&&&&
&BUTTON_Handle hB
& switch(pMsg-&MsgId)
caseWM_PAINT:
&&&&&WM_DefaultProc(pMsg);
// Handle dialog
items&&&&//--------------(8)
After drawing the dialog items add some user drawn items to
&&&&&GUI_SetPenSize(10);
&&&&&GUI_SetColor(GUI_GREEN);
&&&&&GUI_DrawLine(
95,& 5, 185, 95);
&&&&&GUI_SetColor(GUI_RED);
&&&&&GUI_DrawLine(
95, 95, 185,& 5);
caseWM_INIT_DIALOG:
&&&&&hButton
= WM_GetDialogItem(hDlg, GUI_ID_BUTTON0);
&&&&&WM_SetHasTrans(hButton);&&&&&&&&&&&&&//
Settransparency flag for
button&&&//--------------(9)
caseWM_KEY:
switch(((WM_KEY_INFO
*)(pMsg-&Data.p))-&Key) {
caseGUI_KEY_ESCAPE:
&&&&&&&&&GUI_EndDialog(hDlg,
caseGUI_KEY_ENTER:
&&&&&&&&&GUI_EndDialog(hDlg,
caseWM_NOTIFY_PARENT:
&&&&&Id&&&
=WM_GetId(pMsg-&hWinSrc);&&&&&
// Id of widget
pMsg-&Data.v;&&&&&&&&&&&&&&&&
// Notification code
switch(NCode) {
caseWM_NOTIFICATION_RELEASED:&&&&&
// React only if
released&//--------------(10)
&&&&&&&&&hButton
= WM_GetDialogItem(hDlg, GUI_ID_BUTTON0);
if(Id == GUI_ID_BUTTON1)
callback&//--------------(11)
&&&&&&&&&&&if
(WM_GetCallback(hButton) == _cbButton) {
&&&&&&&&&&&&&WM_SetCallback(hButton,
BUTTON_Callback);
&&&&&&&&&&&}
&&&&&&&&&&&&&WM_SetCallback(hButton,
_cbButton);
&&&&&&&&&&&}
&&&&&&&&&&&WM_InvalidateWindow(hButton);
if(Id == GUI_ID_BUTTON2)
&// Toggle
font&//--------------(12)
&&&&&&&&&&&if
&&&&&&&&&&&&&BUTTON_SetFont(hButton,
&GUI_Font13_1);
&&&&&&&&&&&}
&&&&&&&&&&&&&BUTTON_SetFont(hButton,
&GUI_Font8x16);
&&&&&&&&&&&}
&&&&&&&&&&&_Font
if(Id == GUI_ID_BUTTON3)
&// Toggle
color&//--------------(13)
&&&&&&&&&&&if
(_Color) {
&&&&&&&&&&&&&BUTTON_SetBkColor(hButton,
0, 0xaaaaaa);
&&&&&&&&&&&&&BUTTON_SetBkColor(hButton,
1, GUI_WHITE);
&&&&&&&&&&&&&BUTTON_SetTextColor(hButton,
0, GUI_BLACK);
&&&&&&&&&&&&&BUTTON_SetTextColor(hButton,
1, GUI_BLACK);
&&&&&&&&&&&}
&&&&&&BUTTON_SetBkColor(hButton,
0, GUI_BLUE);
&&&&&&&&&&&&&BUTTON_SetBkColor(hButton,
1, GUI_RED);
&&&&&&&&&&&&&BUTTON_SetTextColor(hButton,
0, GUI_WHITE);
&&&&&&&&&&&&&BUTTON_SetTextColor(hButton,
1, GUI_YELLOW);
&&&&&&&&&&&}
&&&&&&&&&&&_Color
if(Id == GUI_ID_OK)
{&&&&&&&&&&&
Button&//--------------(14)
&&&&&&&&&&&GUI_EndDialog(hDlg,
if(Id == GUI_ID_CANCEL)
Button&//--------------(15)
&&&&&&&&&&&GUI_EndDialog(hDlg,
&&&&&WM_DefaultProc(pMsg);
void MainTask(void) {
&GUI_Init();
&// Check if recommended memory for the
sample is available
& if(GUI_ALLOC_GetNumFreeBytes()
& RECOMMENDED_MEMORY) {
&&&GUI_ErrorOut("Not
enough memory available.");
&// Use memory devices for all
& #ifGUI_SUPPORT_MEMDEV
&&&WM_SetCreateFlags(WM_CF_MEMDEV);
&&&WM_EnableMemdev(WM_HBKWIN);
&WM_SetDesktopColor(GUI_GREEN);
& while(1) {
_Font =_Color = 0;
&&&GUI_ExecDialogBox(_aDialogCreate,
GUI_COUNTOF(_aDialogCreate),&_cbDialog, 0, 0,
&&&GUI_Delay(1000);
1.&&&&&按钮自定义回调函数中WM_PAINT消息的处理。
2.&&&&&通过函数(WIDGET_GetState(hObj)
& BUTTON_STATE_PRESSED) ? 1:
0返回当前按钮是按下还是未按下,按下的话,返回数值1,未按下返回数值0。根据这个返回值,在WM_PIANT消息里面绘制按钮按下和未按下两种状态的显示效果。
3.&&&&&根据变量_Pressed的数值设置是否显示字符,如果变量数值非0表示按钮被按下,显示字符Button
pressed,如果未按下,仅显示字符Button。变量_Pressed数值的改变是在按钮回调函数_cbButton里面修改的。其实这里直接使用第2条中函数(WIDGET_GetState(hObj)
&BUTTON_STATE_PRESSED) ? 1 :
0的返回值就可以的,官方这里设计的稍有些啰嗦了。
4.&&&&&按钮自定义的回调函数。
5.&&&&&按钮自定义回调函数中WM_PAINT消息的处理。
6.&&&&&按钮回调函数中,除了WM_PIANT消息,其它消息的处理继续使用系统默认的函数BUTTON_Callback(pMsg)来实现。
7.&&&&&如果按钮被按下,回调函数首先收到的就是这个WM_TOUCH消息,然后才是WM_PAINT消息的处理,这样的话,就可以通过这个消息配合函数BUTTON_IsPressed(pMsg-&hWin)来设置变量_Pressed,赋值为1表示按下,赋值为0表示未按下。
8.&&&&&函数WM_DefaultProc(pMsg)放在这里比较巧妙,先调用这个函数的话,系统就会按照默认配置先重绘对话框,然后用户在这个基础上再绘制自己需要的内容。
9.&&&&&通过函数WM_SetHasTrans设置ID为GUI_ID_BUTTON0的按钮控件的透明效果。
10.&&按钮释放后的消息处理。
11.&&按钮ID为GUI_ID_BUTTON1的按钮释放消息处理,这里实现对ID为GUI_ID_BUTTON0按钮的回调函数切换。
12.&&按钮ID为GUI_ID_BUTTON2的按钮释放消息处理,这里实现对ID为GUI_ID_BUTTON0按钮显示字体的切换。
13.&&按钮ID为GUI_ID_BUTTON3的按钮释放消息处理,这里实现对ID为GUI_ID_BUTTON0按钮显示文本的背景色和前景色的切换。
14.&&按钮ID为GUI_ID_OK的按钮释放消息处理,此按钮在本程序未用到,因为没有创建ID为GUI_ID_OK的按钮。
15.&&按钮ID为GUI_ID_CANCEL的按钮释放消息处理,这里实现关闭阻塞式对话框。如果关闭了,1秒后会重新创建这个对话框,如此循环。
显示效果如下:
47.4&实验例程说明(RTOS)
配套例子:
V6-561_STemWin实验_Button按钮控通过自定义回调函数实现各种按钮效果(RTOS)
实验目的:
1.&&&&&本实验主要学习通过按钮自定义回调函数实现各种按钮效果。这里实现了两种按钮效果,一个是图标按钮,另一个是扁平化效果的按钮。
2.&&&&&emWin功能的实现在MainTask.c文件里面。
实验内容:
1.&&&&&K1按键按下,串口打印任务执行情况(波特率115200,数据位8,奇偶校验位无,停止位1)。
2.&&&&&K2按键按下,实现截图功能,将图片以BMP格式保存到SD卡中。
3.&&&&&各个任务实现的功能如下:
&&&&&&&&&&&&&
Start&&&任务:实现按键和触摸扫描。
&&&&&&&&&&&&&
App Task MspPro任务
:实现截图功能,将图片以BMP格式保存到SD卡中。
&&&&&&&&&&&&&
UserIF&&任务:按键消息处理。
&&&&&&&&&&&&&
COM&&&任务:暂未使用。
& App Task
GUI&&&&任务:GUI任务。
μCOS-III任务调试信息(按K1按键,串口打印):
STemWin界面显示效果:
800*480分辨率界面效果。
STemWin动态内存配置:
GUIConf.c文件中的配置如下:
EX_SRAM&&1
#if EX_SRAM
#define GUI_NUMBYTES&
#define GUI_NUMBYTES&
(100*1024)
通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:
#define&EX_SRAM&&&&1&表示使用外部SDRAM作为emWin动态内存,大小8MB。
#define&EX_SRAM&&&&0&表示使用内部SRAM作为emWin动态内存,大小100KB。
默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。
STemWin底层接口配置:
LCDConf_Lin_Template.c文件中共12项emWin配置:
#define emWin_Optimize&&
XSIZE_PHYS&&&&&&
YSIZE_PHYS&&&&&&
NUM_BUFFERS&&&&&
NUM_VSCREENS&&&&
BK_COLOR&&&&&&&&GUI_DARKBLUE
#undef&GUI_NUM_LAYERS
GUI_NUM_LAYERS&&&
#define LCD_LAYER0_FRAME_BUFFER&
EXT_SDRAM_ADDR
#define LCD_LAYER1_FRAME_BUFFER&
(LCD_LAYER0_FRAME_BUFFER + XSIZE_PHYS *YSIZE_PHYS * 4 *
NUM_VSCREENS *
NUM_BUFFERS)
#define_CM_ARGB8888&&&&&
_CM_RGB888&&&&&&&
_CM_RGB565&&&&&&&
_CM_ARGB1555&&&&&
_CM_ARGB4444&&&&&
_CM_L8&&&&&&&&&&&
_CM_AL44&&&&&&&&&
_CM_AL88&&&&&&&&&
COLOR_MODE_0&&&&&
_CM_RGB565
XSIZE_0&&&&&&&&&&
XSIZE_PHYS
YSIZE_0&&&&&&&&&&
YSIZE_PHYS
COLOR_MODE_1&&&&&
_CM_RGB565
XSIZE_1&&&&&&&&&&
XSIZE_PHYS
YSIZE_1&&&&&&&&&&
YSIZE_PHYS
#if&&(COLOR_MODE_0 ==
_CM_ARGB8888)
& #defineCOLOR_CONVERSION_0
GUICC_M8888I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_32
#elif (COLOR_MODE_0 == _CM_RGB888)
& #defineCOLOR_CONVERSION_0
GUICC_M888
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_24
#elif (COLOR_MODE_0 == _CM_RGB565)
& #defineCOLOR_CONVERSION_0
GUICC_M565
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_16
#elif (COLOR_MODE_0 == _CM_ARGB1555)
& #defineCOLOR_CONVERSION_0
GUICC_M1555I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_16
#elif (COLOR_MODE_0 == _CM_ARGB4444)
& #defineCOLOR_CONVERSION_0
GUICC_M4444I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_16
#elif (COLOR_MODE_0 == _CM_L8)
& #defineCOLOR_CONVERSION_0
GUICC_8666
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_8
#elif (COLOR_MODE_0 == _CM_AL44)
COLOR_CONVERSION_0GUICC_1616I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_8
#elif (COLOR_MODE_0 == _CM_AL88)
& #defineCOLOR_CONVERSION_0
GUICC_88666I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_16
& #errorIllegal color mode 0!
#if (GUI_NUM_LAYERS & 1)
#if&&(COLOR_MODE_1 ==
_CM_ARGB8888)
& #defineCOLOR_CONVERSION_1
GUICC_M8888I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_32
#elif (COLOR_MODE_1 == _CM_RGB888)
& #defineCOLOR_CONVERSION_1
GUICC_M888
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_24
#elif (COLOR_MODE_1 == _CM_RGB565)
& #defineCOLOR_CONVERSION_1
GUICC_M565
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_16
#elif (COLOR_MODE_1 == _CM_ARGB1555)
& #defineCOLOR_CONVERSION_1
GUICC_M1555I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_16
#elif (COLOR_MODE_1 == _CM_ARGB4444)
& #defineCOLOR_CONVERSION_1
GUICC_M4444I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_16
#elif (COLOR_MODE_1 == _CM_L8)
& #defineCOLOR_CONVERSION_1
GUICC_8666
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_8
#elif (COLOR_MODE_1 == _CM_AL44)
& #defineCOLOR_CONVERSION_1
GUICC_1616I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_8
#elif (COLOR_MODE_1 == _CM_AL88)
& #defineCOLOR_CONVERSION_1
GUICC_88666I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_16
& #error Illegalcolor mode 1!
#undef XSIZE_0
#undef YSIZE_0
XSIZE_0&&&&&&
XSIZE_PHYS
YSIZE_0&&&&&&
YSIZE_PHYS
#ifndef&&XSIZE_PHYS
& #errorPhysical X size of display is not
#ifndef&&YSIZE_PHYS
& #errorPhysical Y size of display is not
#ifndef&&NUM_VSCREENS
& #defineNUM_VSCREENS 1
& #if(NUM_VSCREENS &=
#errorAt least one screeen needs to be defined!
#if (NUM_VSCREENS & 1)
&& (NUM_BUFFERS&
& #errorVirtual screens and multiple
buffers are not allowed!
对于这12个配置选项,注释说明已经比较详细。默认情况下,本教程配套的emWin例子都是用的三缓冲,RGB565格式,且仅使用单图层。
程序设计:
任务栈大小分配:
μCOS-III任务栈大小在os_cfg.h文件中配置:
APP_CFG_TASK_START_STK_SIZE&&&&&&&&&&&&&&&&&&&&
APP_CFG_TASK_MsgPro_STK_SIZE&&&&&&&&&&&&&&&&&&&
APP_CFG_TASK_COM_STK_SIZE&&&&&&&&&&&&&&&&&&&&&&
APP_CFG_TASK_USER_IF_STK_SIZE&&&&&&&&&&&&&&&&&&&
APP_CFG_TASK_GUI_STK_SIZE&&&&&&&&&&&&&&&&&&&&&&&
任务栈大小的单位是4字节,那么每个任务的栈大小如下:
Start&&&任务:2048字节。
App Task MspPro任务 :2048字节。
UserIF&&任务:2048字节。
COM&&&任务:2048字节。
GUI&&&&任务:4096字节。
系统栈大小分配:
μCOS-III的系统栈大小在os_cfg_app.h文件中配置:
OS_CFG_ISR_STK_SIZE&&&&&&&&&&&&&&&&&&&&&
系统栈大小的单位是4字节,那么这里就是配置系统栈大小为2KB。
μCOS-III初始化:
int main(void)
&&&OS_ERR&
&&&OSInit(&err);&
OSTaskCreate((OS_TCB&&&&&&
*)&AppTaskStartTCB,
&&&&&&&&&&&&
&&&&&&&&&&&&&&&&(CPU_CHAR&&&&
*)"App TaskStart",&
&&&&&&&&&&&&&&&&(OS_TASK_PTR&&
)AppTaskStart,&&&&
&&&&&&&&&&&&&&&&(void&&&&&&&&
*)0,&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&(OS_PRIO&&&&&&)APP_CFG_TASK_START_PRIO,
&&&&&&&&&&&&&&&&(CPU_STK&&&&&*)&AppTaskStartStk[0],&&&
&&&&&&&&&&&&&&&&(CPU_STK_SIZE&)APP_CFG_TASK_START_STK_SIZE
&&&&&&&&&&&&&&&&(CPU_STK_SIZE&)APP_CFG_TASK_START_STK_SIZE,&&&&&
&&&&&&&&&&&&&&&&(OS_MSG_QTY&&&
&&&&&&&&&&&&&&&&(OS_TICK&&&&&&
&&&&&&&&&&&&&&&&(void&&&&&&&&
&&&&&&&&&&&&&&&&(OS_OPT&&&&&&&)(OS_OPT_TASK_STK_CHK
| OS_OPT_TASK_STK_CLR),
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&(OS_ERR&&&&&&
&&&OSStart(&err);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&(void)&
return(0);
硬件外设初始化
硬件外设的初始化是在bsp.c文件实现:
void bsp_Init(void)
&&&RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
SystemCoreClockUpdate();&&&
bsp_InitUart();&&
bsp_InitKey();&&&&&&&&
bsp_InitExtIO();&&
bsp_InitLed();&&&&&&&
bsp_InitI2C();&&&&&&&&
&&&&&bsp_InitSPIBus();&
&&&&&bsp_InitSFlash();&&
bsp_InitExtSDRAM();&
bsp_DetectLcdType(); &
TOUCH_InitHard();&
LCD_ConfigLTDC();&
result =f_mount(&fs, "0:/", 0);
五个μCOS-III任务的实现:
static&void&
AppTaskStart (void *p_arg)
OS_ERR&&&&&
uint8_t& ucCount = 0;
uint8_t& ucCount1 = 0;
&&&(void)p_&
CPU_Init();&
bsp_Init();&&&&&&
BSP_Tick_Init();&
#if OS_CFG_STAT_TASK_EN & 0u
&&&&OSStatTaskCPUUsageInit(&err);&&
#ifdef CPU_CFG_INT_DIS_MEAS_EN
&&&CPU_IntDisMeasMaxCurReset();
AppTaskCreate();
AppObjCreate();
if(g_tTP.Enable== 1)
&&&&&&&&&&&&&
TOUCH_Scan();
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
ucCount++;
&&&&&&&&&&&&&
if(ucCount== 10)
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
ucCount= 0;
&&&&&&&&&&&&&&&&&&
bsp_KeyScan();
&&&&&&&&&&&&&
&&& OSTimeDly(1,
OS_OPT_TIME_DLY,
&err);&&&&&&&&&&
if(g_GT811.Enable== 1)
&&&&&&&&&&&&&
bsp_KeyScan();
&&&&&&&&&&&&&
ucCount1++;
&&&&&&&&&&&&&
if(ucCount1== 2)
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
ucCount1= 0;
&&&&&&&&&&&&&&&&&&
GT811_OnePiontScan();
&&&&&&&&&&&&&
OSTimeDly(10, OS_OPT_TIME_DLY,
&err);&&&&&
if(g_tFT5X06.Enable== 1)
&&&&&&&&&&&&&
bsp_KeyScan();
&&&&&&&&&&&&&
FT5X06_OnePiontScan();
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
static void AppTaskMsgPro(void *p_arg)
uint32_tulStart, ulE
OS_ERR&&&&&
uint8_t&&&&&&
Pic_Name = 0;
charbuf[20];
OSSemPend((OS_SEM*)&SEM_SYNCH,
&&&&&&&&&&&&&&&&&&
& (OS_TICK )0,
&&&&&&&&&&&&&&&&&&
(OS_OPT&)OS_OPT_PEND_BLOCKING,
&&&&&&&&&&&&&&&&&&
& (CPU_TS&)0,
&&&&&&&&&&&&&&&&&&
& (OS_ERR *)&err);
if(err== OS_ERR_NONE)
&&&&&&&&&&&&&
sprintf(buf,"0:/PicSave/%d.bmp",Pic_Name);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
ulStart= OSTimeGet(&err);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
OSSchedLock(&err);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
result= f_mkdir("0:/PicSave");
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
result= f_open(&file,buf,
FA_WRITE|FA_CREATE_ALWAYS);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
GUI_BMP_Serialize(_WriteByte2File,&file);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&& result =
f_close(&file);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
OSSchedUnlock(&err);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
ulEnd= OSTimeGet(&err);
&&&&&&&&&&&&&
ulEnd-= ulS
&&&&&&&&&&&&&
&&&&&&&&&&&&&
App_Printf("截图完成,耗时 = %dms\r\n",
&&&&&&&&&&&&&
Pic_Name++;&&&&&&
}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
static void AppTaskUserIF(void *p_arg)
OS_ERR&&&&&
uint8_t& ucKeyC
&&&&&&&&&&&&&
ucKeyCode= bsp_GetKey();
if(ucKeyCode != KEY_NONE)
&&&&&&&&&&&&&
switch(ucKeyCode)
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
caseKEY_DOWN_K1:&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
DispTaskInfo();&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
caseKEY_DOWN_K2:&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
OSSemPost((OS_SEM*)&SEM_SYNCH,
&&&&&&&&&&&&&&&&&&&&&&&&&&&
(OS_OPT&)OS_OPT_POST_1,
&&&&&&&&&&&&&&&&&&&&&&&&&&&
(OS_ERR *)&err);&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
default:&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
OSTimeDly(20,OS_OPT_TIME_DLY, &err);
static void AppTaskCOM(void *p_arg)
OSTimeDly(500, OS_OPT_TIME_DLY, &err);
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
static void AppTaskGUI(void *p_arg)
&&&(void)p_&&&&&&
MainTask();
emWin任务的具体实现(在MainTask.c文件里面):
#include"MainTask.h"
#include"includes.h"
static GUI_CONST_STORAGE unsigned long _acpic1[]
&0xFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
&&&&&&&0xFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFF000000,
&&&&&&&0xFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFF000000,
GUI_CONST_STORAGE GUI_BITMAP bmpic1 = {
& 64, // xSize
& 64, // ySize
BytesPerLine
BitsPerPixel
& (unsignedchar *)_acpic1,
&// Pointer to picture
// Pointer to palette
&GUI_DRAW_BMP8888
#defineID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#defineID_BUTTON_0&&
(GUI_ID_USER + 0x01)
#defineID_BUTTON_1&&
(GUI_ID_USER + 0x02)
static constGUI_WIDGET_CREATE_INFO _aDialogCreate[]
& { FRAMEWIN_CreateIndirect,"Framewin",
ID_FRAMEWIN_0, 0, 0, 800, 480, 0, 0x64, 0 },
BUTTON_CreateIndirect,&&
"",&&&&&&&&
ID_BUTTON_0, 30, 30, 80, 80, 0, 0x0, 0},
BUTTON_CreateIndirect,&&
"",&&&&&&&&
ID_BUTTON_1, 30, 150, 120, 40, 0, 0x0,0 },
static void_cbButton(WM_MESSAGE * pMsg)
WM_HWIN&hW
hWin&= pMsg-&hW
switch (pMsg-&MsgId)
case WM_PAINT:
&&&&&&&&&&&&&
if (BUTTON_IsPressed(hWin))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_WHITE);
&&&&&&&&&&&&&&&&&&
GUI_Clear();
&&&&&&&&&&&&&&&&&&
GUI_SetAlpha(0xb0);
&&&&&&&&&&&&&&&&&&
GUI_DrawBitmap(&bmpic1,8, 8);
&&&&&&&&&&&&&&&&&&
GUI_SetAlpha(0);&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_DrawBitmap(&bmpic1,8,
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
BUTTON_Callback(pMsg);
static void_cbButton1(WM_MESSAGE * pMsg)
WM_HWIN&hW
GUI_RECT R
hWin&= pMsg-&hW
switch (pMsg-&MsgId)
case WM_PAINT:
&&&&&&&&&&&&&
WM_GetClientRect(&Rect);
&&&&&&&&&&&&&
if (BUTTON_IsPressed(hWin))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_DARKGRAY);
&&&&&&&&&&&&&&&&&&
GUI_FillRoundedRect(Rect.x0,Rect.y0, Rect.x1, Rect.y1,
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_DARKGRAY);
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_WHITE);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_LIGHTBLUE);
&&&&&&&&&&&&&&&&&&
GUI_FillRoundedRect(Rect.x0,Rect.y0, Rect.x1, Rect.y1,
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_LIGHTBLUE);
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_WHITE);&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
GUI_SetFont(&GUI_Font16_ASCII);
&&&&&&&&&&&&&
GUI_DispStringInRect("LED1",&Rect, GUI_TA_HCENTER |
GUI_TA_VCENTER);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
BUTTON_Callback(pMsg);
static void_cbDialog(WM_MESSAGE * pMsg)
WM_HWIN hI
int&&&&Id;
switch (pMsg-&MsgId)
case WM_INIT_DIALOG:
&&&&&&&&&&&&&
&&&&&&&&&&&&&
//初始化框架窗口
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem = pMsg-&hW
&&&&&&&&&&&&&
FRAMEWIN_SetFont(hItem,GUI_FONT_32B_ASCII);
&&&&&&&&&&&&&
FRAMEWIN_SetTextAlign(hItem,GUI_TA_HCENTER |
GUI_TA_VCENTER);
&&&&&&&&&&&&&
FRAMEWIN_SetText(hItem,"armfly");
&&&&&&&&&&&&&
&&&&&&&&&&&&&&//
&&&&&&&&&&&&&
//初始化按钮控件
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem =WM_GetDialogItem(pMsg-&hWin,
ID_BUTTON_0);
&&&&&&&&&&&&&
WM_SetHasTrans(hItem);
&&&&&&&&&&&&&
WM_SetCallback(hItem, _cbButton);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
//初始化按钮控件
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem =WM_GetDialogItem(pMsg-&hWin,
ID_BUTTON_1);
&&&&&&&&&&&&&
WM_SetHasTrans(hItem);
&&&&&&&&&&&&&
WM_SetCallback(hItem, _cbButton1);
&&&&&&&&&&&&&
case WM_NOTIFY_PARENT:
&&&&&&&&&&&&&
WM_GetId(pMsg-&hWinSrc);
&&&&&&&&&&&&&
NCode = pMsg-&Data.v;
switch(Id)
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
case ID_BUTTON_0:
&&&&&&&&&&&&&&&&&&&&&&
switch(NCode)
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
caseWM_NOTIFICATION_CLICKED:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
caseWM_NOTIFICATION_RELEASED:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
WM_DefaultProc(pMsg);
WM_HWINCreateFramewin(void)
WM_HWIN hW
GUI_CreateDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),
_cbDialog, WM_HBKWIN, 0, 0);
voidMainTask(void)
GUI_Init();
WM_MULTIBUF_Enable(1);
//TOUCH_Calibration();
CreateFramewin();
GUI_Delay(10);
47.5实验例程说明(裸机)
配套例子:
V6-562_STemWin实验_Button按钮控通过自定义回调函数实现各种按钮效果(裸机)
实验目的:
1.&&&&&本实验主要学习通过按钮自定义回调函数实现各种按钮效果。这里实现了两种按钮效果,一个是图标按钮,另一个是扁平化效果的按钮。
2.&&&&&emWin功能的实现在MainTask.c文件里面。
STemWin界面显示效果:
800*480分辨率界面效果。
STemWin动态内存配置:
GUIConf.c文件中的配置如下:
EX_SRAM&&1
#if EX_SRAM
#define GUI_NUMBYTES&
#define GUI_NUMBYTES&
(100*1024)
通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:
#define&EX_SRAM&&&&1&表示使用外部SDRAM作为emWin动态内存,大小8MB。
#define&EX_SRAM&&&&0&表示使用内部SRAM作为emWin动态内存,大小100KB。
默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。
STemWin底层接口配置:
LCDConf_Lin_Template.c文件中共12项emWin配置:
#define emWin_Optimize&&
XSIZE_PHYS&&&&&&
YSIZE_PHYS&&&&&&
NUM_BUFFERS&&&&&
NUM_VSCREENS&&&&
BK_COLOR&&&&&&&&GUI_DARKBLUE
#undef&GUI_NUM_LAYERS
GUI_NUM_LAYERS&&&
#define LCD_LAYER0_FRAME_BUFFER&
EXT_SDRAM_ADDR
#define LCD_LAYER1_FRAME_BUFFER&
(LCD_LAYER0_FRAME_BUFFER + XSIZE_PHYS *YSIZE_PHYS * 4 *
NUM_VSCREENS *
NUM_BUFFERS)
#define_CM_ARGB8888&&&&&
_CM_RGB888&&&&&&&
_CM_RGB565&&&&&&&
_CM_ARGB1555&&&&&
_CM_ARGB4444&&&&&
_CM_L8&&&&&&&&&&&
_CM_AL44&&&&&&&&&
_CM_AL88&&&&&&&&&
COLOR_MODE_0&&&&&
_CM_RGB565
XSIZE_0&&&&&&&&&&
XSIZE_PHYS
YSIZE_0&&&&&&&&&&
YSIZE_PHYS
COLOR_MODE_1&&&&&
_CM_RGB565
XSIZE_1&&&&&&&&&&
XSIZE_PHYS
YSIZE_1&&&&&&&&&&
YSIZE_PHYS
#if&&(COLOR_MODE_0 ==
_CM_ARGB8888)
& #defineCOLOR_CONVERSION_0
GUICC_M8888I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_32
#elif (COLOR_MODE_0 == _CM_RGB888)
& #defineCOLOR_CONVERSION_0
GUICC_M888
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_24
#elif (COLOR_MODE_0 == _CM_RGB565)
& #defineCOLOR_CONVERSION_0
GUICC_M565
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_16
#elif (COLOR_MODE_0 == _CM_ARGB1555)
& #defineCOLOR_CONVERSION_0
GUICC_M1555I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_16
#elif (COLOR_MODE_0 == _CM_ARGB4444)
& #defineCOLOR_CONVERSION_0
GUICC_M4444I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_16
#elif (COLOR_MODE_0 == _CM_L8)
& #defineCOLOR_CONVERSION_0
GUICC_8666
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_8
#elif (COLOR_MODE_0 == _CM_AL44)
& #defineCOLOR_CONVERSION_0
GUICC_1616I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_8
#elif (COLOR_MODE_0 == _CM_AL88)
& #defineCOLOR_CONVERSION_0
GUICC_88666I
#defineDISPLAY_DRIVER_0&&
GUIDRV_LIN_16
& #errorIllegal color mode 0!
#if (GUI_NUM_LAYERS & 1)
#if&&(COLOR_MODE_1 ==
_CM_ARGB8888)
& #defineCOLOR_CONVERSION_1
GUICC_M8888I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_32
#elif (COLOR_MODE_1 == _CM_RGB888)
& #defineCOLOR_CONVERSION_1
GUICC_M888
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_24
#elif (COLOR_MODE_1 == _CM_RGB565)
& #defineCOLOR_CONVERSION_1
GUICC_M565
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_16
#elif (COLOR_MODE_1 == _CM_ARGB1555)
& #defineCOLOR_CONVERSION_1
GUICC_M1555I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_16
#elif (COLOR_MODE_1 == _CM_ARGB4444)
& #defineCOLOR_CONVERSION_1
GUICC_M4444I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_16
#elif (COLOR_MODE_1 == _CM_L8)
& #defineCOLOR_CONVERSION_1
GUICC_8666
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_8
#elif (COLOR_MODE_1 == _CM_AL44)
& #defineCOLOR_CONVERSION_1
GUICC_1616I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_8
#elif (COLOR_MODE_1 == _CM_AL88)
& #defineCOLOR_CONVERSION_1
GUICC_88666I
#defineDISPLAY_DRIVER_1&&
GUIDRV_LIN_16
& #errorIllegal color mode 1!
#undef XSIZE_0
#undef YSIZE_0
XSIZE_0&&&&&&
XSIZE_PHYS
YSIZE_0&&&&&&
YSIZE_PHYS
XSIZE_PHYS
& #errorPhysical X size of display is not
#ifndef&&YSIZE_PHYS
& #errorPhysical Y size of display is not
#ifndef&&NUM_VSCREENS
& #defineNUM_VSCREENS 1
& #if(NUM_VSCREENS &=
#errorAt least one screeen needs to be defined!
#if (NUM_VSCREENS & 1)
&& (NUM_BUFFERS&
& #errorVirtual screens and multiple
buffers are not allowed!
对于这12个配置选项,注释说明已经比较详细。默认情况下,本教程配套的emWin例子都是用的三缓冲,RGB565格式,且仅使用单图层。
程序设计:
栈大小分配:
系统栈大小在startup_stm32f429_439xx.s文件中配置:
&栈大小的单位是字节,那么这里配置系统栈大小为8192字节。
主函数初始化:
int main (void)
bsp_Init();
MainTask();
硬件外设初始化
硬件外设的初始化是在bsp.c文件实现:
void bsp_Init(void)
&&&RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
SystemCoreClockUpdate();&&&
bsp_InitUart();&&
bsp_InitKey();&&&&&&&&
bsp_InitExtIO();&&
bsp_InitLed();&&&&&&&
bsp_InitI2C();&&&&&&&&
&&&&&bsp_InitSPIBus();&
&&&&&bsp_InitSFlash();&&
bsp_InitExtSDRAM();&
bsp_DetectLcdType(); &
TOUCH_InitHard();&
LCD_ConfigLTDC();&
result =f_mount(&fs, "0:/", 0);
emWin功能的具体实现(在MainTask.c文件里面):
#include"MainTask.h"
#include"bsp.h"
static GUI_CONST_STORAGE unsigned long _acpic1[]
&0xFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
&&&&&&&0xFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFF000000,
&&&&&&&0xFF000000,
0xFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFFxFF000000,
0xFFxFFxFFxFF000000,
0xFF000000,
GUI_CONST_STORAGE GUI_BITMAP bmpic1 = {
& 64, // xSize
& 64, // ySize
BytesPerLine
BitsPerPixel
& (unsignedchar *)_acpic1,
&// Pointer to picture
// Pointer to palette
&GUI_DRAW_BMP8888
#defineID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#defineID_BUTTON_0
&&(GUI_ID_USER + 0x01)
#defineID_BUTTON_1&&
(GUI_ID_USER + 0x02)
static constGUI_WIDGET_CREATE_INFO _aDialogCreate[]
& { FRAMEWIN_CreateIndirect,"Framewin",
ID_FRAMEWIN_0, 0, 0, 800, 480, 0, 0x64, 0 },
BUTTON_CreateIndirect,&&
"",&&&&&&&&
ID_BUTTON_0, 30, 30, 80, 80, 0, 0x0, 0},
BUTTON_CreateIndirect,&&
"",&&&&&&&&
ID_BUTTON_1, 30, 150, 120, 40, 0, 0x0,0 },
static void_cbButton(WM_MESSAGE * pMsg)
WM_HWIN&hW
hWin&= pMsg-&hW
switch (pMsg-&MsgId)
case WM_PAINT:
&&&&&&&&&&&&&
if (BUTTON_IsPressed(hWin))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_WHITE);
&&&&&&&&&&&&&&&&&&
GUI_Clear();
&&&&&&&&&&&&&&&&&&
GUI_SetAlpha(0xb0);
&&&&&&&&&&&&&&&&&&
GUI_DrawBitmap(&bmpic1,8, 8);
&&&&&&&&&&&&&&&&&&
GUI_SetAlpha(0);&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_DrawBitmap(&bmpic1,8,
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
BUTTON_Callback(pMsg);
static void_cbButton1(WM_MESSAGE * pMsg)
WM_HWIN&hW
GUI_RECT R
hWin&= pMsg-&hW
switch (pMsg-&MsgId)
case WM_PAINT:
&&&&&&&&&&&&&
WM_GetClientRect(&Rect);
&&&&&&&&&&&&&
if (BUTTON_IsPressed(hWin))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_DARKGRAY);
&&&&&&&&&&&&&&&&&&
GUI_FillRoundedRect(Rect.x0,Rect.y0, Rect.x1, Rect.y1,
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_DARKGRAY);
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_WHITE);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_LIGHTBLUE);
&&&&&&&&&&&&&&&&&&
GUI_FillRoundedRect(Rect.x0,Rect.y0, Rect.x1, Rect.y1,
&&&&&&&&&&&&&&&&&&
GUI_SetBkColor(GUI_LIGHTBLUE);
&&&&&&&&&&&&&&&&&&
GUI_SetColor(GUI_WHITE);&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
GUI_SetFont(&GUI_Font16_ASCII);
&&&&&&&&&&&&&
GUI_DispStringInRect("LED1",&Rect, GUI_TA_HCENTER |
GUI_TA_VCENTER);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
BUTTON_Callback(pMsg);
static void_cbDialog(WM_MESSAGE * pMsg)
WM_HWIN hI
int&&&&Id;
switch (pMsg-&MsgId)
case WM_INIT_DIALOG:
&&&&&&&&&&&&&
&&&&&&&&&&&&&
//初始化框架窗口
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem = pMsg-&hW
&&&&&&&&&&&&&
FRAMEWIN_SetFont(hItem,GUI_FONT_32B_ASCII);
&&&&&&&&&&&&&
FRAMEWIN_SetTextAlign(hItem,GUI_TA_HCENTER |
GUI_TA_VCENTER);
&&&&&&&&&&&&&
FRAMEWIN_SetText(hItem,"armfly");
&&&&&&&&&&&&&
&&&&&&&&&&&&&&//
&&&&&&&&&&&&&
//初始化按钮控件
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem =WM_GetDialogItem(pMsg-&hWin,
ID_BUTTON_0);
&&&&&&&&&&&&&
WM_SetHasTrans(hItem);
&&&&&&&&&&&&&
WM_SetCallback(hItem, _cbButton);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
//初始化按钮控件
&&&&&&&&&&&&&
&&&&&&&&&&&&&
hItem =WM_GetDialogItem(pMsg-&hWin,
ID_BUTTON_1);
&&&&&&&&&&&&&
WM_SetHasTrans(hItem);
&&&&&&&&&&&&&
WM_SetCallback(hItem, _cbButton1);
&&&&&&&&&&&&&
case WM_NOTIFY_PARENT:
&&&&&&&&&&&&&
WM_GetId(pMsg-&hWinSrc);
&&&&&&&&&&&&&
NCode = pMsg-&Data.v;
&&&&&&&&&&&&&
switch(Id)
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
case ID_BUTTON_0:
&&&&&&&&&&&&&&&&&&&&&&
switch(NCode)
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
caseWM_NOTIFICATION_CLICKED:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
caseWM_NOTIFICATION_RELEASED:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
WM_DefaultProc(pMsg);
WM_HWINCreateFramewin(void)
WM_HWIN hW
GUI_CreateDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),
_cbDialog, WM_HBKWIN, 0, 0);
voidMainTask(void)
GUI_Init();
WM_MULTIBUF_Enable(1);
//TOUCH_Calibration();
CreateFramewin();
GUI_Delay(10);
本章节主要为大家讲解了按钮控件自定义回调函数的实现方法,对于这种方法,望初学者一定要掌握,后面章节学习其它控件做自定义回调函数,方法是相同的。
硬汉Eric2013
博客等级:
博客积分:0
博客访问:384,676
关注人气:0
荣誉徽章:

我要回帖

更多关于 https www小电影 的文章

 

随机推荐