硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2167|回复: 8
收起左侧

[emWin教程入门篇] 【emWin实战教程V2.0】第36章      窗口管理器之回

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2017-2-16 16:47:55 | 显示全部楼层 |阅读模式
完整65章+12章附件教程下载地址:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=19834



第36章      窗口管理器之回调消息类型



    本章节为大家讲解STemWin窗口管理器的消息类型。如果说窗口管理器是STemWin的核心,那么消息机制就是窗口管理的核心,这部分知识非常的重要,后面章节后面章节学习控件,对话框都是以消息为基础的,初学者务必要掌握。
    学习本章节前一定要优先学习第35章的窗口管理器基础知识。
36.1  初学者重要提示
33.2 消息机制简介
33.3 消息结构
33.4 消息类型
33.5 系统类型消息实例
33.6 指针输入设备(PID)类型消息实例
33.7 通知代码类型消息实例
36.8 总结
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-16 16:48:55 | 显示全部楼层
36.1  初学者重要提示


u  尽管本章节非常重要,但是初学者也不必担心,通过本章节对窗口管理器的消息类型有个初步的认识,随着后面章节的学习,慢慢就会融会贯通,因为后面每个章节基本都要用到消息机制了。
u  窗口管理器中消息类型相关知识在emWin手册中都有讲解,下图是中文版讲解位置
36.1.png


下图是英文版手册讲解位置:
36.2.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-16 16:49:51 | 显示全部楼层
36.2 消息机制简介


    尽管消息机制是STemWin的核心,但是STemWin手册中讲解的确很少,而且STemWin也是
没有源码的,深入学习比较困难,不过没有关系,并不影响我们去使用。
    对于STemWin的消息机制,简单的理解就是这样:比如操作一个触控界面,上面有按钮,滚
动条,编辑框等控件,当用户去触摸某个控件时都会触发窗口管理器去处理这些消息,并跳转到
窗口回调函数的相应消息里面,这些消息里面就是需要添加的功能。比如我们想点击按钮后实现
LED翻转,我们就可以在按钮所在窗口回调函数的按钮消息中加入LED翻转功能就可以实现这种效
果了。具体消息是如何传输的,用户不需要去管,只需在回调函数相应的消息里面加入功能就可以
了。从这个角度来看,消息机制还是比较容易掌握的。
    对于初学者来说,明白了这点就可以了,通过后面实际的例子来进一步加强认识。另外,要实现
消息机制就得有消息结构变量用来指示消息类型和一些其它相关的功能,下面讲解这部分知识。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-16 16:50:24 | 显示全部楼层
36.3 消息结构


    回调函数被调用时,它会收到以其pMsg参数指定的消息。此消息实际上是一个WM_MESSAGE数据结构,其元素定义如下。
36.3.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-16 16:51:32 | 显示全部楼层
36.4  消息类型


    STemWin支持的消息类型主要分为以下三类(STemWin5.32支持的类型
系统定义的消息类型:
36.4.png

指针输入设备(PID)消息类型:
36.5.png

通知代码类型:
36.6.png

用户定义消息类型:
36.7.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-16 16:53:22 | 显示全部楼层
36.5 系统类型消息实例


    下面我们通过一个具体的实例来讲解系统消息类型,这里我们通过前面章节讲的GUIBuilder5.32创建一个如下的对话框,并对其做了简单的修改,方便作为实例进行说明(关于对话框的内容会在后面的教程跟大家详细讲解,这里重点看系统类消息)。
显示效果如下(分辨率为480*272):
36.8.png

创建立以后生成的代码如下(重点看系统消息部分,可以直接将代码复制到模拟器或者开发板上面运行
  1. #include "DIALOG.h"
  2. /*
  3. *********************************************************************************************************
  4. *                                         宏定义
  5. *********************************************************************************************************
  6. */
  7. #define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
  8. #define ID_BUTTON_0 (GUI_ID_USER + 0x01)
  9. #define ID_SCROLLBAR_0 (GUI_ID_USER + 0x02)
  10. #define ID_SLIDER_0 (GUI_ID_USER + 0x03)
  11. /*
  12. *********************************************************************************************************
  13. *                           GUI_WIDGET_CREATE_INFO类型数组
  14. *********************************************************************************************************
  15. */
  16. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  17.   { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 480, 272, 0, 0x64, 0 },
  18.   { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 130, 28, 147, 35, 0, 0x0, 0 },
  19.   { SCROLLBAR_CreateIndirect, "Scrollbar", ID_SCROLLBAR_0, 129, 74, 147, 28, 0, 0x0, 0 },
  20.   { SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 133, 118, 137, 25, 0, 0x0, 0 },
  21. };
  22. /*
  23. *********************************************************************************************************
  24. *    函 数 名: _cbDialog
  25. *    功能说明: 对话框回调函数        
  26. *    形    参: pMsg  回调参数
  27. *    返 回 值: 无
  28. *********************************************************************************************************
  29. */
  30. static void _cbDialog(WM_MESSAGE * pMsg)
  31. {
  32.      WM_HWIN hItem;
  33.      int     NCode;
  34.      int     Id;
  35.      switch (pMsg->MsgId)    //--------------(1)
  36.      {
  37.          case WM_INIT_DIALOG:  //--------------(2)
  38.             
  39.               //
  40.               // 初始化 'Framewin'
  41.               //
  42.               hItem = pMsg->hWin;
  43.               FRAMEWIN_SetFont(hItem, GUI_FONT_32B_ASCII);
  44.               FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
  45.               FRAMEWIN_SetText(hItem, "armfly");
  46.         
  47.               //
  48.               // 初始化 'Button'
  49.               //
  50.               hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
  51.               BUTTON_SetFont(hItem, GUI_FONT_24B_ASCII);
  52.               BUTTON_SetText(hItem, "armfly");
  53.               break;
  54.          case WM_PAINT:  //--------------(3)
  55.              GUI_SetBkColor(GUI_BLUE);
  56.              GUI_Clear();
  57.              break;
  58.         case WM_KEY:    //--------------(4)
  59.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  60.             {
  61.                 case GUI_KEY_ESCAPE:
  62.                     GUI_EndDialog(pMsg->hWin, 1);
  63.                     break;
  64.                 case GUI_KEY_ENTER:
  65.                     GUI_EndDialog(pMsg->hWin, 0);
  66.                     break;
  67.             }
  68.               break;
  69.          case WM_NOTIFY_PARENT:  //--------------(5)
  70.               Id    = WM_GetId(pMsg->hWinSrc);
  71.               NCode = pMsg->Data.v;
  72.               switch(Id)
  73.               {
  74.                    case ID_BUTTON_0:
  75.                        switch(NCode)
  76.                        {
  77.                             case WM_NOTIFICATION_CLICKED:
  78.                                  break;
  79.                            
  80.                             case WM_NOTIFICATION_RELEASED:
  81.                                  break;
  82.                        }
  83.                        break;
  84.                   
  85.                    case ID_SCROLLBAR_0:
  86.                        switch(NCode)
  87.                        {
  88.                             case WM_NOTIFICATION_CLICKED:
  89.                                  break;
  90.                            
  91.                             case WM_NOTIFICATION_RELEASED:
  92.                                  break;
  93.                            
  94.                             case WM_NOTIFICATION_VALUE_CHANGED:
  95.                                  break;
  96.                        }
  97.                        break;
  98.                   
  99.                    case ID_SLIDER_0:
  100.                        switch(NCode)
  101.                        {
  102.                             case WM_NOTIFICATION_CLICKED:
  103.                                  break;
  104.                            
  105.                             case WM_NOTIFICATION_RELEASED:
  106.                                  break;
  107.                            
  108.                             case WM_NOTIFICATION_VALUE_CHANGED:
  109.                                  break;
  110.                        }
  111.                        break;
  112.               }
  113.               break;
  114.             
  115.          default:
  116.               WM_DefaultProc(pMsg);
  117.               break;
  118.      }
  119. }
  120. /*
  121. *********************************************************************************************************
  122. *    函 数 名: CreateFramewin
  123. *    功能说明: 创建对话框      
  124. *    形    参: 无
  125. *    返 回 值: 返回对话框句柄
  126. *********************************************************************************************************
  127. */
  128. WM_HWIN CreateFramewin(void)
  129. {
  130.      WM_HWIN hWin;
  131.      hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  132.      return hWin;
  133. }
  134. /*
  135. *********************************************************************************************************
  136. *    函 数 名: MainTask
  137. *    功能说明: GUI主函数
  138. *    形    参: 无
  139. *    返 回 值: 无
  140. *********************************************************************************************************
  141. */
  142. void MainTask(void)
  143. {
  144.      /* 初始emWin */
  145.      GUI_Init();
  146.      /* 创建对话框 */
  147.     CreateFramewin();
  148.      while(1)
  149.      {
  150.          GUI_Delay(10);
  151.      }
  152. }
复制代码
重点看对话框回调函数_cbDialog中的内容:

1.   通过switch (pMsg->MsgId) 区分各种系统消息类型。
2.   WM_INIT_DIALOG消息:
        对话框初始化消息,这里主要是初始化框架窗口的的标题和按钮控件。一般对话框上面的控件初始化,Window(窗口)或者FrameWin(框架窗口)的初始化都是在这个消息里面完成,同时用户也可以在这个消息里面创建新的窗口,控件等。

3.   WM_PAINT消息:
        重绘消息,这里实现背景色的重绘,背景色被设置为蓝色。文本显示API函数,数值显示API函数以及2D图形相关的API函数都可以在这个消息里面调用。

4.   WM_KEY消息:
        按键消息,当前聚焦的窗口才可以收到这个消息。这个消息主要通过外部实体按键来发送,本教程的第62章专门讲解这方面的应用。另外,上面代码中Data.p指针指向WM_KEY_INFO结构的消息,WM_KEY_INFO的定义如下:
36.9.png


5.   WM_NOTIFY_PARENT
            告知父窗口,其子窗口中发生了某些改变。这些消息通常由控件发送到父窗口,让父窗口可以对事件作出反应。消息的Data.v值包含消息的通知代码。上面对话框上创建的按钮,滚动条,滑动条就是通过这个消息进行操作的。
        通过这个实例先有一个感性的认识,随着后面章节的学习逐渐加强认识。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-16 16:54:49 | 显示全部楼层
36.6  指针输入设备(PID)类型消息实例


    基于上面36.5小节的例子,实现PID类型消息WM_MOUSEOVER,代码如下(可以直接将代码复制到模拟器或者开发板上面运行):
  1. #include "DIALOG.h"
  2. /*
  3. *********************************************************************************************************
  4. *                                         变量
  5. *********************************************************************************************************
  6. */
  7. static GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};   //--------------(1)
  8. static unsigned char ucBackColor;
  9. /*
  10. *********************************************************************************************************
  11. *                                         宏定义
  12. *********************************************************************************************************
  13. */
  14. #define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
  15. #define ID_BUTTON_0 (GUI_ID_USER + 0x01)
  16. #define ID_SCROLLBAR_0 (GUI_ID_USER + 0x02)
  17. #define ID_SLIDER_0 (GUI_ID_USER + 0x03)
  18. /*
  19. *********************************************************************************************************
  20. *                           GUI_WIDGET_CREATE_INFO类型数组
  21. *********************************************************************************************************
  22. */
  23. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  24.   { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 480, 272, 0, 0x64, 0 },
  25.   { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 130, 28, 147, 35, 0, 0x0, 0 },
  26.   { SCROLLBAR_CreateIndirect, "Scrollbar", ID_SCROLLBAR_0, 129, 74, 147, 28, 0, 0x0, 0 },
  27.   { SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 133, 118, 137, 25, 0, 0x0, 0 },
  28. };
  29. /*
  30. *********************************************************************************************************
  31. *    函 数 名: _cbDialog
  32. *    功能说明: 对话框回调函数        
  33. *    形    参: pMsg  回调参数
  34. *    返 回 值: 无
  35. *********************************************************************************************************
  36. */
  37. static void _cbDialog(WM_MESSAGE * pMsg)
  38. {
  39.      WM_HWIN hItem;
  40.      int     NCode;
  41.      int     Id;
  42.      switch (pMsg->MsgId)
  43.      {
  44.          case WM_INIT_DIALOG:
  45.             
  46.               //
  47.               // 初始化 'Framewin'
  48.               //
  49.               hItem = pMsg->hWin;
  50.               FRAMEWIN_SetFont(hItem, GUI_FONT_32B_ASCII);
  51.               FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
  52.               FRAMEWIN_SetText(hItem, "armfly");
  53.         
  54.               //
  55.               // 初始化 'Button'
  56.               //
  57.               hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
  58.               BUTTON_SetFont(hItem, GUI_FONT_24B_ASCII);
  59.               BUTTON_SetText(hItem, "armfly");
  60.               /* 默认背景色取GUI_BLUE,即蓝色 */
  61.               ucBackColor = 0;
  62.               break;
  63.          case WM_PAINT:
  64.               GUI_SetBkColor(_acColor[ucBackColor]); //--------------(2)
  65.               GUI_Clear();
  66.               break;
  67.         case WM_MOUSEOVER:       //--------------(3)
  68.               ucBackColor++;
  69.               if (ucBackColor == 3)
  70.               {
  71.                    ucBackColor = 0;
  72.               }
  73.               WM_InvalidateWindow(pMsg->hWin);
  74.               break;
  75.         case WM_KEY:
  76.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  77.             {
  78.                 case GUI_KEY_ESCAPE:
  79.                     GUI_EndDialog(pMsg->hWin, 1);
  80.                     break;
  81.                 case GUI_KEY_ENTER:
  82.                     GUI_EndDialog(pMsg->hWin, 0);
  83.                     break;
  84.             }
  85.               break;
  86.          case WM_NOTIFY_PARENT:
  87.               Id    = WM_GetId(pMsg->hWinSrc);
  88.               NCode = pMsg->Data.v;
  89.               switch(Id)
  90.               {
  91.                    case ID_BUTTON_0:
  92.                        switch(NCode)
  93.                        {
  94.                             case WM_NOTIFICATION_CLICKED:
  95.                                  break;
  96.                            
  97.                             case WM_NOTIFICATION_RELEASED:
  98.                                  break;
  99.                        }
  100.                        break;
  101.                   
  102.                    case ID_SCROLLBAR_0:
  103.                        switch(NCode)
  104.                        {
  105.                             case WM_NOTIFICATION_CLICKED:
  106.                                  break;
  107.                            
  108.                             case WM_NOTIFICATION_RELEASED:
  109.                                  break;
  110.                            
  111.                             case WM_NOTIFICATION_VALUE_CHANGED:
  112.                                  break;
  113.                         }
  114.                        break;
  115.                   
  116.                    case ID_SLIDER_0:
  117.                        switch(NCode)
  118.                        {
  119.                             case WM_NOTIFICATION_CLICKED:
  120.                                  break;
  121.                            
  122.                             case WM_NOTIFICATION_RELEASED:
  123.                                  break;
  124.                            
  125.                             case WM_NOTIFICATION_VALUE_CHANGED:
  126.                                  break;
  127.                        }
  128.                        break;
  129.               }
  130.               break;
  131.             
  132.          default:
  133.               WM_DefaultProc(pMsg);
  134.               break;
  135.      }
  136. }
  137. /*
  138. *********************************************************************************************************
  139. *    函 数 名: CreateFramewin
  140. *    功能说明: 创建对话框      
  141. *    形    参: 无
  142. *    返 回 值: 返回对话框句柄
  143. *********************************************************************************************************
  144. */
  145. WM_HWIN CreateFramewin(void)
  146. {
  147.      WM_HWIN hWin;
  148.      hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  149.      return hWin;
  150. }
  151. /*
  152. *********************************************************************************************************
  153. *    函 数 名: MainTask
  154. *    功能说明: GUI主函数
  155. *    形    参: 无
  156. *    返 回 值: 无
  157. *********************************************************************************************************
  158. */
  159. void MainTask(void)
  160. {
  161.      /* 初始emWin */
  162.      GUI_Init();
  163.      /* 显示光标 */
  164.      GUI_CURSOR_Show();
  165.      /* 创建对话框 */
  166.     CreateFramewin();
  167.      while(1)
  168.      {
  169.          GUI_Delay(10);
  170.      }
  171. }
复制代码
重点看对话框回调函数_cbDialog中指针输入设备类型消息WM_MOUSEOVER的实现:

1.     定义一个数组,里面有三种颜色,定义一个变量,用于三种颜色的切换。
2.     在WM_PAINT消息中实现重绘,主要用于实现对话框客户区的颜色重绘。背景颜色的初始值_acColor[ucBackColor],变量ucBackColor已经在WM_INIT_DIALOG消息里面进行了初始化,首次显示是蓝色。
3.     这里加入了消息WM_MOUSEOVER,如果鼠标功能已经使能,当鼠标箭头接触到窗口时将触发窗口回调函数里面的这个消息。在这个消息里面切换对话框的背景色变量,然后调用 函数WM_InvalidateWindow将对话框进行无效化,从而会触发窗口管理器去执行WM_PAINT消息,这样就实现了对话框背景色的变化。
实例的显示效果如下(分辨率480*272):
36.10.png

PID类型的其它消息,后面章节用到的时候再给大家讲解。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-16 16:55:52 | 显示全部楼层
36.7  通知代码类型消息实例


   基于上面36.5小节的例子,实现通知代码类型消息,通过操作按钮来实现对话框背景色的改变。代码如下(可以直接将代码复制到模拟器或者开发板上面运行)
  1. #include "DIALOG.h"
  2. /*
  3. *********************************************************************************************************
  4. *                                         变量
  5. *********************************************************************************************************
  6. */
  7. static GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};    //--------------(1)
  8. static unsigned char ucBackColor;
  9. /*
  10. *********************************************************************************************************
  11. *                                         宏定义
  12. *********************************************************************************************************
  13. */
  14. #define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
  15. #define ID_BUTTON_0 (GUI_ID_USER + 0x01)
  16. #define ID_SCROLLBAR_0 (GUI_ID_USER + 0x02)
  17. #define ID_SLIDER_0 (GUI_ID_USER + 0x03)
  18. /*
  19. *********************************************************************************************************
  20. *                           GUI_WIDGET_CREATE_INFO类型数组
  21. *********************************************************************************************************
  22. */
  23. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  24.   { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 480, 272, 0, 0x64, 0 },
  25.   { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 130, 28, 147, 35, 0, 0x0, 0 },
  26.   { SCROLLBAR_CreateIndirect, "Scrollbar", ID_SCROLLBAR_0, 129, 74, 147, 28, 0, 0x0, 0 },
  27.   { SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 133, 118, 137, 25, 0, 0x0, 0 },
  28. };
  29. /*
  30. *********************************************************************************************************
  31. *    函 数 名: _cbDialog
  32. *    功能说明: 对话框回调函数        
  33. *    形    参: pMsg  回调参数
  34. *    返 回 值: 无
  35. *********************************************************************************************************
  36. */
  37. static void _cbDialog(WM_MESSAGE * pMsg)
  38. {
  39.      WM_HWIN hItem;
  40.      int     NCode;
  41.      int     Id;
  42.      switch (pMsg->MsgId)
  43.      {
  44.          case WM_INIT_DIALOG:
  45.             
  46.               //
  47.               // 初始化 'Framewin'
  48.               //
  49.               hItem = pMsg->hWin;
  50.               FRAMEWIN_SetFont(hItem, GUI_FONT_32B_ASCII);
  51.               FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
  52.               FRAMEWIN_SetText(hItem, "armfly");
  53.         
  54.               //
  55.               // 初始化 'Button'
  56.               //
  57.               hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
  58.               BUTTON_SetFont(hItem, GUI_FONT_24B_ASCII);
  59.               BUTTON_SetText(hItem, "armfly");
  60.              /* 默认背景色取GUI_BLUE,即蓝色 */
  61.               ucBackColor = 0;
  62.               break;
  63.          case WM_PAINT:    //--------------(2)
  64.              GUI_SetBkColor(_acColor[ucBackColor]);
  65.              GUI_Clear();
  66.              break;
  67.         case WM_KEY:
  68.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  69.             {
  70.                 case GUI_KEY_ESCAPE:
  71.                     GUI_EndDialog(pMsg->hWin, 1);
  72.                     break;
  73.                 case GUI_KEY_ENTER:
  74.                     GUI_EndDialog(pMsg->hWin, 0);
  75.                     break;
  76.             }
  77.               break;
  78.          case WM_NOTIFY_PARENT:
  79.               Id    = WM_GetId(pMsg->hWinSrc);
  80.               NCode = pMsg->Data.v;
  81.               switch(Id)
  82.               {
  83.                    case ID_BUTTON_0:
  84.                        switch(NCode)
  85.                        {
  86.                             case WM_NOTIFICATION_CLICKED:     //--------------(3)
  87.                                  ucBackColor++;
  88.                                  if (ucBackColor == 3)
  89.                                  {
  90.                                      ucBackColor = 0;
  91.                                  }
  92.                                  WM_InvalidateWindow(pMsg->hWin);
  93.                                  break;
  94.                            
  95.                             case WM_NOTIFICATION_RELEASED:
  96.                                  break;
  97.                        }
  98.                        break;
  99.                   
  100.                    case ID_SCROLLBAR_0:
  101.                        switch(NCode)
  102.                        {
  103.                             case WM_NOTIFICATION_CLICKED:
  104.                                  break;
  105.                            
  106.                             case WM_NOTIFICATION_RELEASED:
  107.                                  break;
  108.                            
  109.                             case WM_NOTIFICATION_VALUE_CHANGED:
  110.                                  break;
  111.                         }
  112.                        break;
  113.                   
  114.                    case ID_SLIDER_0:
  115.                        switch(NCode)
  116.                        {
  117.                             case WM_NOTIFICATION_CLICKED:
  118.                                  break;
  119.                            
  120.                             case WM_NOTIFICATION_RELEASED:
  121.                                  break;
  122.                            
  123.                             case WM_NOTIFICATION_VALUE_CHANGED:
  124.                                  break;
  125.                        }
  126.                        break;
  127.               }
  128.               break;
  129.             
  130.          default:
  131.               WM_DefaultProc(pMsg);
  132.               break;
  133.      }
  134. }
  135. /*
  136. *********************************************************************************************************
  137. *    函 数 名: CreateFramewin
  138. *    功能说明: 创建对话框      
  139. *    形    参: 无
  140. *    返 回 值: 返回对话框句柄
  141. *********************************************************************************************************
  142. */
  143. WM_HWIN CreateFramewin(void)
  144. {
  145.      WM_HWIN hWin;
  146.      hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  147.      return hWin;
  148. }
  149. /*
  150. *********************************************************************************************************
  151. *    函 数 名: MainTask
  152. *    功能说明: GUI主函数
  153. *    形    参: 无
  154. *    返 回 值: 无
  155. *********************************************************************************************************
  156. */
  157. void MainTask(void)
  158. {
  159.      /* 初始emWin */
  160.      GUI_Init();
  161.      /* 创建对话框 */
  162.     CreateFramewin();
  163.      while(1)
  164.      {
  165.          GUI_Delay(10);
  166.      }
  167. }
复制代码
重点看对话框回调函数_cbDialog中按钮的WM_NOTIFICATION_CLICKED消息实现:

1.     定义一个数组,里面有三种颜色,定义一个变量,用于三种颜色的切换。
2.     在WM_PAINT消息中实现重绘,主要用于实现对话框客户区的颜色重绘。背景颜色的初始值_acColor[ucBackColor],变量ucBackColor已经在WM_INIT_DIALOG消息里面进行了初始化,首次显示是蓝色。
3.     用户点击了按钮后,在这个消息里面切换对话框的背景色变量,然后调用函数WM_InvalidateWindow将对话框进行无效化,从而会触发窗口管理器去执行WM_PAINT消息,这样就实现了对话框背景色的变化。
实例的显示效果如下(分辨率为480*272):
36.11.png

更多通知类消息会在后面控件类章节中进行讲解。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-16 16:56:14 | 显示全部楼层
36.8  总结


本章节就跟大家讲这么多,只给大家举了部分消息类型的通信实例,后面还会通过更多例子来强化大家对这方面知识的理解。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 23:37 , Processed in 0.189759 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表