硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第33章 窗口管理器之消息类型

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-2-13 15:57:58 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第33章 窗口管理器之消息类型

    本期教程开始讲解STemWin的消息类型,这部分知识也非常的重要,大家可以不懂消息的通信机制,但必须的知道简单的通信过程。
    33. 1  消息结构
    33. 2 消息类型
    33. 3 系统类型消息实例
    33. 4 指针输入设备(PID)类型消息实例
    33. 5 通知代码类型消息实例
    33. 6 总结

33.1 消息结构
    回调例程被调用时,它会收到以其pMsg参数指定的消息。此消息实际上是一个WM_MESSAGE数据结构,其元素定义如下。

数据类型

元素

描述

int

MsgId

消息的类型

WM_HWIN

hWin

目标窗口

WM_HWIN

hWinSrc

源窗口

void*

Data.p

数据指针

int

Data.v

数据值


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

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

通知代码类型:
33.3.png
33.4.png


用户定义消息类型:
33.5.png


33.3 系统类型消息实例
    下面我们通过一个具体的实例来讲解系统消息类型。这里我们通过前面讲的uCGUIBulder4.0创建一个如下的对话框(关于对话框的内容会在后面的教程跟大家详细讲解)。
33.6.png

建立以后生成的代码如下(重点看系统消息部分
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"
  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"
  18. //EventsFunctionList
  19. void OnButtonClicked(WM_MESSAGE * pMsg);
  20. void OnButtonReleased(WM_MESSAGE * pMsg);
  21. void OnButtonMovedOut(WM_MESSAGE * pMsg);
  22. //EndofEventsFunctionList
  23. /*********************************************************************
  24. *
  25. *       Dialog resource
  26. *
  27. * This table conatins the info required to create the dialog.
  28. * It has been created by ucGUIbuilder.
  29. */
  30. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  31.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  32.     { BUTTON_CreateIndirect,    "BUTTON0",           GUI_ID_BUTTON0,          82, 122,162,37, 0,0},
  33.     { BUTTON_CreateIndirect,    "BUTTON1",           GUI_ID_BUTTON1,          357,123,152,35, 0,0}
  34. };
  35. /*****************************************************************
  36. **      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  37. **      Function: to initialize the Dialog items
  38. **                                                      
  39. **      call this function in _cbCallback --> WM_PAINT
  40. *****************************************************************/
  41. void PaintDialog(WM_MESSAGE * pMsg)
  42. {
  43.     WM_HWIN hWin = pMsg->hWin;
  44. }
  45. /*****************************************************************
  46. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  47. **      Function: to initialize the Dialog items
  48. **                                                      
  49. **      call this function in _cbCallback --> WM_INIT_DIALOG
  50. *****************************************************************/
  51. void InitDialog(WM_MESSAGE * pMsg)
  52. {
  53.     WM_HWIN hWin = pMsg->hWin;
  54.     //
  55.     //FRAMEWIN
  56.     //
  57.     FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
  58.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  59.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  60.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  61.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  62.     FRAMEWIN_SetTitleHeight(hWin,30);
  63. }
  64. /*********************************************************************
  65. *
  66. *       Dialog callback routine
  67. */
  68. static void _cbCallback(WM_MESSAGE * pMsg)
  69. {
  70.     int NCode, Id;
  71.     WM_HWIN hWin = pMsg->hWin;
  72.     switch (pMsg->MsgId) (1)
  73.     {
  74.         case WM_PAINT:(2)
  75.             PaintDialog(pMsg);
  76.             break;
  77.         case WM_INIT_DIALOG:(3)
  78.             InitDialog(pMsg);
  79.             break;
  80.         case WM_KEY:  (4)
  81.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  82.             {
  83.                 case GUI_KEY_ESCAPE:
  84.                     GUI_EndDialog(hWin, 1);
  85.                     break;
  86.                 case GUI_KEY_ENTER:
  87.                     GUI_EndDialog(hWin, 0);
  88.                     break;
  89.             }
  90.             break;
  91.         case WM_NOTIFY_PARENT:(5)
  92.             Id = WM_GetId(pMsg->hWinSrc);
  93.             NCode = pMsg->Data.v;        
  94.             switch (Id)
  95.             {
  96.                 case GUI_ID_OK:
  97.                     if(NCode==WM_NOTIFICATION_RELEASED)
  98.                         GUI_EndDialog(hWin, 0);
  99.                     break;
  100.                 case GUI_ID_CANCEL:
  101.                     if(NCode==WM_NOTIFICATION_RELEASED)
  102.                         GUI_EndDialog(hWin, 0);
  103.                     break;
  104.                 case GUI_ID_BUTTON0:
  105.                     switch(NCode)
  106.                     {
  107.                         case WM_NOTIFICATION_CLICKED:
  108.                             OnButtonClicked(pMsg);
  109.                             break;
  110.                         case WM_NOTIFICATION_RELEASED:
  111.                             OnButtonReleased(pMsg);
  112.                             break;
  113.                         case WM_NOTIFICATION_MOVED_OUT:
  114.                             OnButtonMovedOut(pMsg);
  115.                             break;
  116.                     }
  117.                     break;
  118.                 case GUI_ID_BUTTON1:
  119.                     switch(NCode)
  120.                     {
  121.                         case WM_NOTIFICATION_CLICKED:
  122.                             OnButtonClicked(pMsg);
  123.                             break;
  124.                         case WM_NOTIFICATION_RELEASED:
  125.                             OnButtonReleased(pMsg);
  126.                             break;
  127.                         case WM_NOTIFICATION_MOVED_OUT:
  128.                             OnButtonMovedOut(pMsg);
  129.                             break;
  130.                     }
  131.                     break;
  132.             }
  133.             break;
  134.         default:
  135.             WM_DefaultProc(pMsg);
  136.     }
  137. }
  138. /*********************************************************************
  139. *
  140. *       MainTask
  141. *
  142. **********************************************************************
  143. */
  144. void MainTask(void)
  145. {
  146.     GUI_Init();
  147.     WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
  148.     WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
  149.     //PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  150.     //FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  151.     //PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  152.     //BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  153.     //CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  154.     //DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  155.     //SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  156.     //SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  157.     //HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  158.     //RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  159.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  160. }
复制代码
这里咱们重点看对话框的回调函数_cbCallback中的内容:
1. 通过switch (pMsg->MsgId) 区分各种系统消息类型。
2. WM_PAINT
    窗口变为无效 (部分或全部)并需要绘制时,WM将此消息发送到窗口。窗口收到WM_PAINT消息时,应重绘自身。将此消息发送到窗口前,WM确保它已被选定。该消息的Data.p指针指向在屏幕坐标中包含窗口的无效矩形的GUI_RECT结构。此类信息可用于优化着色功能。
3. WM_INIT_DIALOG
       此消息在对话框创建后、显示前发送到窗口。对话框程序通常使用此消息初始化小工具,并执行影响对话框外观的其他任何初始化任务。
    上面程序中初始化了控件FrameWin,主要是设置了一些标题。
4. WM_KEY:
    按下某个键后发送此消息到当前包含焦点的窗体。第31章介绍键盘输入的时候就是用的这个消息。Data.p指针中含有指向WM_KEY_INFO结构的消息。WM_KEY_INFO的定义如下:
33.7.png

5. WM_NOTIFY_PARENT
       告知父窗口,其子窗口中发生了某些改变。这些消息通常由小工具发送到其父窗口,让它们可以对事件作出反应。消息的Data.v值包含消息的通知代码。上面对话框上创建的两个按钮就是通过这个消息进行操作。
    这里我们就先介绍这几种消息,后面再介绍其余的系统消息类型。

33.4 指针输入设备(PID)类型消息实例
    基于上面的例子,我们实现一下PID类型消息WM_MOUSEOVER,代码如下(可以直接复制到模拟器上面运行或者开发板上面)
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"
  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"
  18. /*********************************************************************
  19. *
  20. *       static data
  21. *
  22. **********************************************************************
  23. */
  24. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW}; (1)
  25. static unsigned char ucBackColor; (2)
  26. /*********************************************************************
  27. *
  28. *       Dialog resource
  29. *
  30. * This table conatins the info required to create the dialog.
  31. * It has been created by ucGUIbuilder.
  32. */
  33. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  34.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  35.     { BUTTON_CreateIndirect,    "BUTTON0",           GUI_ID_BUTTON0,          82, 122,162,37, 0,0},
  36.     { BUTTON_CreateIndirect,    "BUTTON1",           GUI_ID_BUTTON1,          357,123,152,35, 0,0}
  37. };
  38. /*****************************************************************
  39. **      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  40. **      Function: to initialize the Dialog items
  41. **                                                      
  42. **      call this function in _cbCallback --> WM_PAINT
  43. *****************************************************************/
  44. void PaintDialog(WM_MESSAGE * pMsg)
  45. {
  46.     WM_HWIN hWin = pMsg->hWin;
  47. GUI_SetBkColor(_acColor[ucBackColor]);(3)
  48. GUI_Clear();
  49. }
  50. /*****************************************************************
  51. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  52. **      Function: to initialize the Dialog items
  53. **                                                      
  54. **      call this function in _cbCallback --> WM_INIT_DIALOG
  55. *****************************************************************/
  56. void InitDialog(WM_MESSAGE * pMsg)
  57. {
  58.     WM_HWIN hWin = pMsg->hWin;
  59.     //
  60.     //FRAMEWIN
  61.     //
  62.     FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);(4)
  63.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  64.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  65.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  66.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  67.     FRAMEWIN_SetTitleHeight(hWin,30);
  68. /* 默认颜色取*/
  69. ucBackColor = 0;(5)
  70. }
  71. /*********************************************************************
  72. *
  73. *       Dialog callback routine
  74. */
  75. static void _cbCallback(WM_MESSAGE * pMsg)
  76. {
  77.     int NCode, Id;
  78.     WM_HWIN hWin = pMsg->hWin;
  79.     switch (pMsg->MsgId)
  80.     {
  81.         case WM_MOUSEOVER:(6)
  82. ucBackColor++;
  83. if (ucBackColor == 3)
  84. {
  85. ucBackColor = 0;
  86. }
  87.             WM_InvalidateWindow(hWin);
  88.             break;
  89. case WM_PAINT:
  90.             PaintDialog(pMsg);
  91.             break;
  92.         case WM_INIT_DIALOG:
  93.             InitDialog(pMsg);
  94.             break;
  95.         case WM_KEY:
  96.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  97.             {
  98.                 case GUI_KEY_ESCAPE:
  99.                     GUI_EndDialog(hWin, 1);
  100.                     break;
  101.                 case GUI_KEY_ENTER:
  102.                     GUI_EndDialog(hWin, 0);
  103.                     break;
  104.             }
  105.             break;
  106.         case WM_NOTIFY_PARENT:
  107.             Id = WM_GetId(pMsg->hWinSrc);
  108.             NCode = pMsg->Data.v;        
  109.             switch (Id)
  110.             {
  111.                 case GUI_ID_OK:
  112.                     if(NCode==WM_NOTIFICATION_RELEASED)
  113.                         GUI_EndDialog(hWin, 0);
  114.                     break;
  115.                 case GUI_ID_CANCEL:
  116.                     if(NCode==WM_NOTIFICATION_RELEASED)
  117.                         GUI_EndDialog(hWin, 0);
  118.                     break;
  119.                 case GUI_ID_BUTTON0:
  120.                     switch(NCode)
  121.                     {
  122.                         case WM_NOTIFICATION_CLICKED:
  123.                             break;
  124.                         case WM_NOTIFICATION_RELEASED:
  125.                             break;
  126.                         case WM_NOTIFICATION_MOVED_OUT:
  127.                             break;
  128.                     }
  129.                     break;
  130.                 case GUI_ID_BUTTON1:
  131.                     switch(NCode)
  132.                     {
  133.                         case WM_NOTIFICATION_CLICKED:
  134.                             break;
  135.                         case WM_NOTIFICATION_RELEASED:
  136.                             break;
  137.                         case WM_NOTIFICATION_MOVED_OUT:
  138.                             break;
  139.                     }
  140.                     break;
  141.             }
  142.             break;
  143.         default:
  144.             WM_DefaultProc(pMsg);
  145.     }
  146. }
  147. /*********************************************************************
  148. *
  149. *       MainTask
  150. *
  151. **********************************************************************
  152. */
  153. void MainTask(void)
  154. {
  155.     GUI_Init();
  156.     WM_SetDesktopColor(GUI_BLUE);      /* Automacally update desktop window */
  157.     WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
  158. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  159. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  160. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  161. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  162. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  163. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  164. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  165. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  166. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  167. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  168.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  169. }
复制代码
1. 定义一个数组,里面有三种颜色。
2. 定义一个变量,用于上面三种颜色的切换。
3. 在WM_PAINT消息中实现重绘,主要用于实现对话框用户区的颜色重绘。
4. WM_INIT_DIALOG消息中初始化对话框中的控件,这里初始化了FrameWin。
5. 初始化背景颜色的初始值_acColor[ucBackColor]
6. 这里加入了消息WM_MOUSEOVER,这个消息的功能是指针输入设备接触到窗口轮廓时发送到窗口。仅在启用鼠标支持时发送。在这个消息里面切换对话框的背景色变量,然后调用函数WM_InvalidateWindow,一旦调用这个函数就会去执行此对话框的WM_PAINT消息。
这个例子的实际显示效果如下:
33.8.png

    PID类型的其它消息,大家可以在模拟器上面做一个简单的测试,后面用到的时候还会跟大家详细讲解。

33.5 通知代码类型消息实例
    这里我们还用上面创建的例子,只不过这次我们主要通过对话框上的按钮来实现这种消息类型。代码如下(可以直接复制到模拟器上面运行或者开发板上面)
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"
  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"
  18. /*********************************************************************
  19. *
  20. *       static data
  21. *
  22. **********************************************************************
  23. */
  24. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};
  25. static  char ucBackColor;
  26. /*********************************************************************
  27. *
  28. *       Dialog resource
  29. *
  30. * This table conatins the info required to create the dialog.
  31. * It has been created by ucGUIbuilder.
  32. */
  33. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  34.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  35.     { BUTTON_CreateIndirect,    "BUTTON0",           GUI_ID_BUTTON0,          82, 122,162,37, 0,0},
  36.     { BUTTON_CreateIndirect,    "BUTTON1",           GUI_ID_BUTTON1,          357,123,152,35, 0,0}
  37. };
  38. /*****************************************************************
  39. **      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  40. **      Function: to initialize the Dialog items
  41. **                                                      
  42. **      call this function in _cbCallback --> WM_PAINT
  43. *****************************************************************/
  44. void PaintDialog(WM_MESSAGE * pMsg)
  45. {
  46.     WM_HWIN hWin = pMsg->hWin;
  47. GUI_SetBkColor(_acColor[ucBackColor]);
  48. GUI_Clear();
  49. }
  50. /*****************************************************************
  51. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  52. **      Function: to initialize the Dialog items
  53. **                                                      
  54. **      call this function in _cbCallback --> WM_INIT_DIALOG
  55. *****************************************************************/
  56. void InitDialog(WM_MESSAGE * pMsg)
  57. {
  58.     WM_HWIN hWin = pMsg->hWin;
  59.     //
  60.     //FRAMEWIN
  61.     //
  62.     FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
  63.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  64.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  65.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  66.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  67.     FRAMEWIN_SetTitleHeight(hWin,30);
  68. /* 默认颜色取*/
  69. ucBackColor = 0;
  70. }
  71. /*********************************************************************
  72. *
  73. *       Dialog callback routine
  74. */
  75. static void _cbCallback(WM_MESSAGE * pMsg)
  76. {
  77.     int NCode, Id;
  78.     WM_HWIN hWin = pMsg->hWin;
  79.     switch (pMsg->MsgId)
  80.     {
  81.         case WM_MOUSEOVER:
  82.             break;
  83. case WM_PAINT:
  84.             PaintDialog(pMsg);
  85.             break;
  86.         case WM_INIT_DIALOG:
  87.             InitDialog(pMsg);
  88.             break;
  89.         case WM_KEY:
  90.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  91.             {
  92.                 case GUI_KEY_ESCAPE:
  93.                     GUI_EndDialog(hWin, 1);
  94.                     break;
  95.                 case GUI_KEY_ENTER:
  96.                     GUI_EndDialog(hWin, 0);
  97.                     break;
  98.             }
  99.             break;
  100.         case WM_NOTIFY_PARENT:
  101.             Id = WM_GetId(pMsg->hWinSrc);
  102.             NCode = pMsg->Data.v;        
  103.             switch (Id)
  104.             {
  105.                 case GUI_ID_OK:
  106.                     if(NCode==WM_NOTIFICATION_RELEASED)
  107.                         GUI_EndDialog(hWin, 0);
  108.                     break;
  109.                 case GUI_ID_CANCEL:
  110.                     if(NCode==WM_NOTIFICATION_RELEASED)
  111.                         GUI_EndDialog(hWin, 0);
  112.                     break;
  113.                 case GUI_ID_BUTTON0:
  114.                     switch(NCode)
  115.                     {
  116.                         case WM_NOTIFICATION_CLICKED:(1)
  117. ucBackColor++;
  118. if (ucBackColor == 3)
  119. {
  120. ucBackColor = 0;
  121. }
  122. WM_InvalidateWindow(hWin);
  123.                             break;
  124.                         case WM_NOTIFICATION_RELEASED:
  125.                             break;
  126.                         case WM_NOTIFICATION_MOVED_OUT:
  127.                             break;
  128.                     }
  129.                     break;
  130.                 case GUI_ID_BUTTON1:
  131.                     switch(NCode)
  132.                     {
  133.                         case WM_NOTIFICATION_CLICKED:(2)
  134. ucBackColor--;
  135. if (ucBackColor < 0)
  136. {
  137. ucBackColor = 2;
  138. }
  139. WM_InvalidateWindow(hWin);
  140.                             break;
  141.                         case WM_NOTIFICATION_RELEASED:
  142.                             break;
  143.                         case WM_NOTIFICATION_MOVED_OUT:
  144.                             break;
  145.                     }
  146.                     break;
  147.             }
  148.             break;
  149.         default:
  150.             WM_DefaultProc(pMsg);
  151.     }
  152. }
  153. /*********************************************************************
  154. *
  155. *       MainTask
  156. *
  157. **********************************************************************
  158. */
  159. void MainTask(void)
  160. {
  161.     GUI_Init();
  162.     WM_SetDesktopColor(GUI_BLUE);      /* Automacally update desktop window */
  163.     WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
  164. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  165. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  166. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  167. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  168. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  169. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  170. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  171. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  172. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  173. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  174.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  175. }
复制代码
1. 这里主要是实现按钮的WM_NOTIFICATION_CLICKED消息。如果用户按下这个按钮,那么就切换背景颜色。
2. 同上,只不过这里用的是另一个按钮。
3. 实际显示效果和上面33.4小节的贴图是一样的。

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

使用道具 举报

336

主题

2045

回帖

3058

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3058
发表于 2015-2-13 18:10:55 | 显示全部楼层
找不到这个函数 PaintDialog()

怎么回事?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107452
QQ
发表于 2015-2-13 20:42:03 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:找不到这个函数 PaintDialog()

怎么回事?
 (2015-02-13 18:10) 
这个工程使用的软件是uCGUIBulder4.0 ,这个软件是国内的一个网友做的,这个函数是他自己写的。
回复

使用道具 举报

0

主题

19

回帖

0

积分

新手上路

积分
0
QQ
发表于 2016-10-23 01:19:21 | 显示全部楼层
case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hWin, 1);
                    break;
                case GUI_KEY_ENTER:
                    GUI_EndDialog(hWin, 0);
                    break;
            }
            break;

不太明白什么意思,不太理解focus的意思key press只有两个button啊key是什么?
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2016-10-23 01:38:36 | 显示全部楼层

回 clarkma 的帖子

clarkma:   case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
      & .. (2016-10-23 01:19) 
键值,用键盘或是矩阵按键时,用来单独向控件发送消息的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-1 22:23 , Processed in 0.182914 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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