【第3版emWin教程】第43章emWin6.x窗⼝管理器实例(含⾃
定义消息)
第43章      emWin6.x窗⼝管理器实例(含⾃定义消息)
为了帮助⼤家更好的理解窗⼝管理器的回调函数和消息机制,本章教程专门做了两个相关的例⼦,帮助⼤家更好的理解。
⽬录
43.1 初学者重要提⽰
通过实例来学习emWin是最佳的学习捷径。
本章节举的两个例⼦都⽤到了对话框,对于初学者来说,仅需知道这是对话框即可,重点是看对话框回调函数的实现,后⾯章节会专门讲解对话框。
窗⼝管理器这块的API函数应该是emWin⼿册所有章节中函数最多的,以后需要⽤到什么功能了,查询就⾏,或者看官⽅的实例,哪个函数不理解了也可以查⼿册。下图是中⽂版⼿册⾥⾯API函数位置:
下图是英⽂版⼿册⾥⾯API函数的位置:
43.2 ⽤户⾃定义消息类型实例
第42章为⼤家讲解的都是emWin⽀持的消息类型,这⾥我们通过⼀个实例来实现⾃定义消息,这个功能在⼤家以后的实际项⽬中都有机会⽤到,⽐较有实战价值。
下⾯我们直接通过如下的代码来讲解实现⽅法和⽤到的函数(可以直接将代码复制到模拟器或者开发板上⾯运⾏)。
#include "DIALOG.h"
/*
*********************************************************************************************************
*                                      变量
*********************************************************************************************************
*/
static GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};  //--------------(1)static unsigned char ucBackColor;
/
*
*********************************************************************************************************
*                                      宏定义
*********************************************************************************************************
*/
#define ID_FRAMEWIN_0  (GUI_ID_USER + 0x00)
#define ID_BUTTON_0    (GUI_ID_USER + 0x01)
#define ID_SCROLLBAR_0 (GUI_ID_USER + 0x02)
#define ID_SLIDER_0    (GUI_ID_USER + 0x03)
#define WM_UPDATE      (WM_USER + 0x00) /* ⾃定义消息 */  // --------------(2)
/*
*********************************************************************************************************
*                        GUI_WIDGET_CREATE_INFO类型数组
*********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 480, 272, 0, 0x64, 0 },  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 130, 28, 147, 35, 0, 0x0, 0 },
{ SCROLLBAR_CreateIndirect, "Scrollbar", ID_SCROLLBAR_0, 129, 74, 147, 28, 0, 0x0, 0 },  { SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 133, 118, 137, 25, 0, 0x0, 0 },
};
/*
*********************************************************************************************************
* 函数名: _cbDialog
* 功能说明: 对话框回调函数
* 形参: pMsg  回调参数
* 返回值: ⽆
*********************************************************************************************************
*/
static void _cbDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hItem;
int    NCode;
int    Id;
switch (pMsg->MsgId)
{
case WM_INIT_DIALOG:
//
// 初始化 'Framewin'
//
hItem = pMsg->hWin;
FRAMEWIN_SetFont(hItem, GUI_FONT_32B_ASCII);
FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
FRAMEWIN_SetText(hItem, "armfly");
//
/
/ 初始化 'Button'
//
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
BUTTON_SetFont(hItem, GUI_FONT_24B_ASCII);
BUTTON_SetText(hItem, "armfly");
/* 默认颜⾊取*/
ucBackColor = 0;
break;
case WM_PAINT:
GUI_SetBkColor(_acColor[ucBackColor]);
GUI_Clear();
break;
case WM_UPDATE:      //--------------(3)
ucBackColor++;
if (ucBackColor == 3)
{
ucBackColor = 0;
}
WM_InvalidateWindow(pMsg->hWin);
break;
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)            {
case GUI_KEY_ESCAPE:
GUI_EndDialog(pMsg->hWin, 1);
break;
case GUI_KEY_ENTER:
GUI_EndDialog(pMsg->hWin, 0);
break;
}
break;
case WM_NOTIFY_PARENT:
Id    = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(Id)
{
case ID_BUTTON_0:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
}
break;
case ID_SCROLLBAR_0:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
case WM_NOTIFICATION_VALUE_CHANGED:
break;
}
break;
case ID_SLIDER_0:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
case WM_NOTIFICATION_VALUE_CHANGED:
break;
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
/*
*********************************************************************************************************
* 函数名: CreateFramewin
* 功能说明: 创建对话框
* 形参: ⽆
* 返回值: 返回对话框句柄
*********************************************************************************************************
*/
WM_HWIN CreateFramewin(void)
{
WM_HWIN hWin;
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
return hWin;
}
/*
*********************************************************************************************************
* 函数名: MainTask
* 功能说明: GUI主函数
* 形参: ⽆
* 返回值: ⽆
*********************************************************************************************************
*/
void MainTask(void)
{
WM_HWIN hDlg;
/* 初始emWin */
GUI_Init();
/* 创建对话框 */
hDlg = CreateFramewin();
while(1)
{
/* 给对话框hDlg发送⾃定义消息WM_UPDATE */
WM_SendMessageNoPara(WM_GetClientWindow(hDlg), WM_UPDATE);  // --------------(4)
GUI_Delay(500);
}
}
实现⾃定义消息的关键是函数WM_SendMessageNoPara的使⽤,学会了这个函数基本就学会了⾃定义消息的实现:
sendmessage返回值
1. 定义⼀个数组,⾥⾯有三种颜⾊,再定义⼀个变量,⽤于三种颜⾊的切换。
2. 定义⼀个⽤户消息WM_UPDATE,⼀定要以WM_USER作为起始值,防⽌跟系统其他的数值冲突。如果还要实现其它⾃定义消息,
在这个数值的基础上⾯定义即可。
3. 在回调函数中加⼊⾃定义消息WM_UPDATE,在这个消息⾥⾯切换对话框的背景⾊变量,然后调⽤函数WM_InvalidateWindow将对
话框进⾏⽆效化,从⽽会触发窗⼝管理器去执⾏WM_PAINT消息,这样就实现了对话框背景⾊的变化。
4. 通过函数WM_SendMessageNoPara()每隔500ms给对话框发送WM_UPDATE消息。函数原型如下:
void WM_SendMessageNoPara(WM_HWIN hWin, int MsgId)
此函数⽤于将不带参数的消息发送到指定窗⼝,使⽤也⽐较简单,第⼀个参数hWin是要接受消息的窗⼝句柄,第⼆个参数MsgId是消息类型。其中第⼀个参数要特别注意,如果是给对话框发消息,且对话框的主体是框架窗⼝FrameWin或者直接给框架窗⼝FrameWin发消息,第⼀个参数必须要使⽤函数WM_GetClientWindow获得框架窗⼝的客户区,这⼀点⾮常重要,经常有初学者在这个地⽅犯错误。如
果对话框的主体是Windows或者直接给Windows窗⼝发消息,⽆需使⽤函数WM_GetClientWindow,直接填句柄就可以了。
此时初学者还会有个疑问,能否使⽤函数WM_SendMessageNoPara可以发送类似WM_PAINT的系统消息?答案是可以的,不过跟发⾃定义消息稍有区别:
/* 设置要⽤于绘制操作的活动窗⼝ */
WM_SelectWindow(WM_GetClientWindow(hDlg));
/* 给对话框hDlg发送系统消息WM_PAINT */
WM_SendMessageNoPara(WM_GetClientWindow(hDlg), WM_PAINT);
/* 切换回默认的桌⾯窗⼝ */
WM_SelectWindow(WM_HBKWIN);
另外还有⼀个带参数的消息发送函数WM_SendMessage,在第38章会有⼀个例⼦调⽤这个函数。最后,本程序的显⽰效果如下(分辨率480*272),每500ms更新⼀次对话框的客户区背景⾊:
43.3 桌⾯窗⼝回调函数实例
这个例⼦为⼤家讲解如何给桌⾯窗⼝配置回调函数。实现源码如下(可以直接将代码复制到模拟器或者开发板上⾯运⾏)。
#include "DIALOG.h"
/*

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。