硬汉嵌入式论坛

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

[emWin教程入门篇] 【emWin实战教程V2.0】第53章   MESSAGEBOX-消息框控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

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



                                       第53章      MESSAGEBOX-消息框控件


        本章节为大家讲解STemWin支持的消息框控件,消息框控件实际上是由框架窗口,按钮控件和文本控件组成的对话框。消息框主要用于信息提示,实际使用也比较简单。
        由于消息框控件较简单,我们没有配套开发板例子,将官方的两个例子给大家讲解下。
53.1 初学者重要提示
53.2 消息框控件基础知识
53.3 官方DIALOG_MessageBox.c实例讲解
53.4 官方DIALOG_MessageBoxUser.c实例讲解
53.5 总结
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-3-10 16:20:51 | 显示全部楼层
53.1  初学者重要提示

1、初学者爱问的问题简单汇总:
        问题1:消息框控件的大小可以改变吗,默认方式显示的太小了?
        答:可以的,详情请看本章节53.4小节讲解的官方例子。
2、消息框控件的所有API函数在emWin手册中都有讲解,下图是中文版手册里面API函数位置:
53.1.png


         下图是英文版手册里面API函数的位置(新的emWin版本已经将这部分知识放在了对话框部分):
53.2.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-3-10 16:22:42 | 显示全部楼层
53.2 消息框控件基础知识

        下面我们先来看看消息对话框长什么样子,不开启皮肤色时显示效果如下:
                                                                     53.3.png
开启皮肤后显示效果如下:
                                                                      53.4.png

相信大家在电脑端经常见到这种提示窗口,没错,就是它,一般主要用于消息提示。消息框控件的组成也比较简单,由
框架窗口,文本控件和按钮控件组成的阻塞式对话框,只有用户点击了上面的按钮才会将此消息框控件关闭。
        消息框控件的使用也比较简单,仅有两个相关的函数:GUI_MessageBox()和MESSAGEBOX_Create()。


53.2.1    消息框控件支持的通知代码

         消息框控件不支持通知代码。


53.2.2  消息框控件支持的键盘反应(输入聚焦)


        由于消息框控件是由框架窗口,文本控件和按钮控件组成,而只有按钮控件是支持聚焦的,所以消息框控件的聚
焦就是按钮的聚焦,按钮支持的键盘消息在第45章的45.2.2小节有讲解,这里不再赘述。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-3-10 16:24:02 | 显示全部楼层
53.3  官方DIALOG_MessageBox.c实例讲解

        这个例子在模拟器中的位置:
53.5.png


主要功能介绍:
        这个例子比较简单,就是函数GUI_MessageBox的调用。
程序代码如下:
  1. #include "GUI.h"
  2. #include "WM.h"
  3. /*********************************************************************
  4. *
  5. *       Defines
  6. *
  7. **********************************************************************
  8. */
  9. //
  10. // Recommended memory to run the sample with adequate performance
  11. //
  12. #define RECOMMENDED_MEMORY (1024L * 10)
  13. /*******************************************************************
  14. *
  15. *       Static code
  16. *
  17. ********************************************************************
  18. */
  19. /*********************************************************************
  20. *
  21. *       _cbBkWindow
  22. */
  23. static void _cbBkWindow(WM_MESSAGE* pMsg) {
  24.   switch (pMsg->MsgId) {
  25.   case WM_PAINT:
  26.     GUI_SetBkColor(GUI_RED);
  27.     GUI_Clear();
  28.     GUI_SetColor(GUI_WHITE);
  29.     GUI_SetFont(&GUI_Font24_ASCII);
  30.     GUI_DispStringHCenterAt("DIALOG_MessageBox - Sample", 160, 5);
  31.     break;
  32.   default:
  33.     WM_DefaultProc(pMsg);
  34.   }
  35. }
  36. /*********************************************************************
  37. *
  38. *       Public code
  39. *
  40. **********************************************************************
  41. */
  42. /*********************************************************************
  43. *
  44. *       MainTask
  45. */
  46. void MainTask(void) {
  47.   GUI_Init();
  48.   //
  49.   // Check if recommended memory for the sample is available
  50.   //
  51.   if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  52.     GUI_ErrorOut("Not enough memory available.");
  53.     return;
  54.   }
  55.   #if GUI_SUPPORT_MEMDEV
  56.     WM_SetCreateFlags(WM_CF_MEMDEV);
  57.   #endif
  58.   WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
  59.   //
  60.   // Create message box and wait until it is closed
  61.   //
  62.   while (1) {
  63.     GUI_MessageBox("This text is shown\\nin a message box",      //--------------(1)
  64.                    "Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE);
  65.     GUI_Delay(750);                    // Wait for a short moment ...
  66.     GUI_MessageBox("New message !",
  67.                    "Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE); //--------------(2)
  68.     GUI_Delay(750);
  69.   }
  70. }
复制代码

1.     通过函数GUI_MessageBox创建消息框控件,这个函数的使用也比较简单,第一个参数是用来设置标题栏显示的内容,第二个参数是文本控件显示的内容,第三个参数用来设置此消息框控件是否可移动。点击OK按钮后,这个消息框控件就关闭了。
2.     再次调用函数GUI_MessageBox创建消息框控件。
实际显示效果如下:
53.6.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-3-10 16:25:38 | 显示全部楼层
53.4 官方DIALOG_MessageBoxUser.c实例讲解

        这个例子在模拟器中的位置:
53.7.png


主要功能介绍:
        由于函数GUI_MessageBox创建的消息框控件比较小,所以官方提供了一个用户自定义方式创建消息框控件,
通过这个例子用户就可以学会如何重新设置消息框控件中的框架窗口,按钮控件和文本控件。
程序代码如下:
  1. #include "DIALOG.h"
  2. #include "MESSAGEBOX.h"
  3. /*********************************************************************
  4. *
  5. *       Defines
  6. *
  7. **********************************************************************
  8. */
  9. //
  10. // Recommended memory to run the sample with adequate performance
  11. //
  12. #define RECOMMENDED_MEMORY (1024L * 10)
  13. /* 字体部分代码省略未贴 */
  14. /*********************************************************************
  15. *
  16. *       Static code
  17. *
  18. **********************************************************************
  19. */
  20. /*********************************************************************
  21. *
  22. *       _CreateMessageBox
  23. */
  24. static WM_HWIN _CreateMessageBox(const char * sMessage, const char * sCaption, int Flags, const GUI_FONT * pFont) {
  25.   WM_HWIN  hWin;
  26.   WM_HWIN  hItem;
  27.   GUI_RECT Rect;
  28.   hWin = MESSAGEBOX_Create(sMessage, sCaption, Flags); //--------------(1)
  29.   //
  30.   // Change font of message box window
  31.   //
  32.   FRAMEWIN_SetFont(hWin, pFont);            //--------------(2)
  33.   //
  34.   // Adjust size
  35.   //
  36.   WM_GetWindowRectEx(hWin, &Rect);          //--------------(3)
  37.   WM_SetWindowPos(hWin, Rect.x0 - 15,
  38.                         Rect.y0 - 15,
  39.                         Rect.x1 - Rect.x0 + 1 + 30,
  40.                         Rect.y1 - Rect.y0 + 1 + 30);
  41.   //
  42.   // Change font of button widget
  43.   //
  44.   hItem = WM_GetDialogItem(hWin, GUI_ID_OK); //--------------(4)
  45.   BUTTON_SetFont(hItem, pFont);
  46.   //
  47.   // Adjust size of button widget
  48.   //
  49.   WM_GetWindowRectEx(hItem, &Rect);           //--------------(5)
  50.   WM_SetWindowPos(hItem, Rect.x0,
  51.                          Rect.y0 + 10,
  52.                          Rect.x1 - Rect.x0 + 1 + 30,
  53.                          Rect.y1 - Rect.y0 + 1 +  5);
  54.   //
  55.   // Change font of text widget
  56.   //
  57.   hItem = WM_GetDialogItem(hWin, GUI_ID_TEXT0); //--------------(6)
  58.   TEXT_SetFont(hItem, pFont);
  59.   //
  60.   // Adjust size text widget
  61.   //
  62.   WM_GetWindowRectEx(hItem, &Rect);           //--------------(7)
  63.   WM_SetWindowPos(hItem, Rect.x0,
  64.                          Rect.y0,
  65.                          Rect.x1 - Rect.x0 + 1 + 30,
  66.                          Rect.y1 - Rect.y0 + 1 + 12);
  67.   return hWin;
  68. }
  69. /*********************************************************************
  70. *
  71. *       _EnableSkinning
  72. */
  73. static void _EnableSkinning(void) {
  74.   FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  75.   BUTTON_SetDefaultSkin  (BUTTON_SKIN_FLEX);
  76. }
  77. /*********************************************************************
  78. *
  79. *       Public code
  80. *
  81. **********************************************************************
  82. */
  83. /*********************************************************************
  84. *
  85. *       MainTask
  86. */
  87. void MainTask(void) {
  88.   GUI_Init();
  89.   //
  90.   // Check if recommended memory for the sample is available
  91.   //
  92.   if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  93.     GUI_ErrorOut("Not enough memory available.");
  94.     return;
  95.   }
  96.   _EnableSkinning();
  97.   while (1) {
  98.     GUI_SetFont(&GUI_Font20B_ASCII);
  99.     GUI_DispStringHCenterAt("Application defined MESSAGEBOX", 160, 5);
  100.     GUI_ExecCreatedDialog(_CreateMessageBox("Message", "Caption", 0, &GUI_Font24)); //--------------(8)
  101.     GUI_Clear();
  102.     GUI_Delay(1000);
  103.   }
  104. }
复制代码

1.     通过函数MESSAGEBOX_Create创建消息框控件,这个函数的使用也比较简单,第一个参数是用来设置文本控件显示的内容,第二个参数是标题栏显示的内容,第三个参数用来设置是否将其设置为模态。
2.    由于消息框控件的组成是框架窗口,文本控件和按钮控件组成的对话框,所以函数MESSAGEBOX_Create返回的句柄实际上就是框架窗口的句柄,从而可以通过函数FRAMEWIN_SetFont调用这个句柄来设置框架窗口的标题字体。
3.    通过函数WM_GetWindowRectEx和WM_SetWindowPos来设置消息框控件(其实就是框架窗口)的大小。
4.    通过函数WM_GetDialogItem获取消息框控件上按钮的句柄(此按钮的ID是GUI_ID_OK),然后设置按钮的字体。
5.    通过函数WM_GetWindowRectEx和WM_SetWindowPos来设置按钮控件的大小。
6.    通过函数WM_GetDialogItem获取消息框控件上文本的句柄(此文本的ID是GUI_ID_TEXT0),然后设置文本的字体。
7.    通过函数WM_GetWindowRectEx和WM_SetWindowPos来设置文本控件的大小。
8.    通过函数GUI_ExecCreatedDialog将消息框控件以阻塞式运行。只有点击了消息框控件上面的按钮,此函数才可以返回。

实际显示效果如下:
53.8.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-3-10 16:26:30 | 显示全部楼层
53.5 总结


        本期教程主要是跟大家讲解了消息框的两种创建方法,一种是系统自带的,直接调用即可显示,也就是讲解的
第一个例子。另一种是用户定义的创建方式,这种模式下用户可以自定义消息框中要显示的内容和控件大小。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

9

主题

34

回帖

61

积分

初级会员

积分
61
发表于 2020-4-19 16:50:47 | 显示全部楼层
话说有429开发板上的例程吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-4-20 21:03:26 | 显示全部楼层
jerry2020 发表于 2020-4-19 16:50
话说有429开发板上的例程吗?

直接复制到一个工程模板的maintask.C文件里面即可测试。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 01:37 , Processed in 0.183115 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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