|
楼主 |
发表于 2017-2-17 16:53:03
|
显示全部楼层
37.2 用户自定义消息类型实例
第36章为大家讲解的都是STemWin支持的消息类型,这里我们通过一个实例来实现自定义消息,这个功能在大家以后的实际项目中都有机会用到,比较有实战价值。
下面我们直接通过如下的代码来讲解实现方法和用到的函数(可以直接将代码复制到模拟器或者开发板上面运行)。
- #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的使用,学会了这个函数基本就学会了自定义消息的实现:
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更新一次对话框的客户区背景色: |
|