硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第51章 MULTIPAGE-多页控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-10 10:54:37 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第51章 MULTIPAGE-多页控件

    本期教程讲解STemWin支持的多页控件。
    51. 1 多页控件介绍
    51. 2 官方WIDGET_Multipage实例
    51. 3 使用GUIBulder建立多页控件
    51. 4 总结

51.1 多页控件介绍
    MULTIPAGE类似于笔记本中的分隔卡或文件柜中的标签。通过使用MULTIPAGE控件,应用程序可为窗口或对话框的相同区域定义多个页面。每个页面包含特定类型的信息或用户选择相应页面时应用程序会显示的一组控件。如果要选择一个页面,则必须单击该页面的选项卡。如果无法显示所有选项卡,则MULTIPAGE控件会自动在边缘处显示一个小滚动条以滚动页面。下表显示MULTIPAGE控件的外观:
51.1.png

MULTIPAGE控件的结构
    包含n个页面的MULTIPAGE小工具由n+2个
窗口组成:
  l 1个MULTIPAGE窗口
  l 1个客户端窗口
  l N个页面窗口
    页面窗口将被添加到小工具的客户端窗口。右图显示了控件的结构。
51.2.png


51.1.1 多页支持的通知代码
    以下事件是编辑框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:

消息

描述

WM_NOTIFICATION_CLICKED

已被点击。

WM_NOTIFICATION_RELEASED

已被释放。

WM_NOTIFICATION_MOVED_OUT

已被点击,且指针已移出控件,但没有释放。

WM_NOTIFICATION_VALUE_CHANGED

编辑小工具的值 (内容)已更改。


51.1.2 多页支持的键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反应

按键

反应

GUI_KEY_PGUP

切换到下一页。

GUI_KEY_PGDOWN

切换到上一页。


51.2 官方WIDGET_Multipage实例
    官方的这个实例很好的演示了MULTIPAGE的使用,这个例子在模拟器中的位置:
51.3.png

源码如下(程序中进行了详细的注释):
  1. #include <stdlib.h>
  2. #include "GUI.h"
  3. #include "MULTIPAGE.h"
  4. /*********************************************************************
  5. *
  6. *       Static data
  7. *
  8. **********************************************************************
  9. */
  10. /*********************************************************************
  11. *
  12. *       Dialog resource
  13. *
  14. *  These tables contain the information required to create the dialogs.
  15. *  It has been created manually, but could also be created by the GUIBuilder.
  16. */
  17. static const GUI_WIDGET_CREATE_INFO _aDialogCreate1[] = {
  18.   { WINDOW_CreateIndirect,    "Dialog 1", 0,                   0,   0, 260, 100, FRAMEWIN_CF_MOVEABLE },
  19.   { BUTTON_CreateIndirect,    "Button",   GUI_ID_BUTTON0,      5,  30,  80,  20, 0},
  20.   { TEXT_CreateIndirect,      "Dialog 1", 0,                   5,  10,  50,  20, TEXT_CF_LEFT }
  21. };
  22. static const GUI_WIDGET_CREATE_INFO _aDialogCreate2[] = {
  23.   { WINDOW_CreateIndirect,    "Dialog 2", 0,                   0,   0, 260, 100, FRAMEWIN_CF_MOVEABLE },
  24.   { CHECKBOX_CreateIndirect,  "",         GUI_ID_CHECK0,       5,  30,   0,   0, 0},
  25.   { CHECKBOX_CreateIndirect,  "",         GUI_ID_CHECK1,       5,  50,   0,   0, 0},
  26.   { TEXT_CreateIndirect,      "Select 0", GUI_ID_TEXT0,       25,  30,  50,  15, TEXT_CF_LEFT },
  27.   { TEXT_CreateIndirect,      "Select 1", GUI_ID_TEXT1,       25,  50,  50,  15, TEXT_CF_LEFT },
  28.   { TEXT_CreateIndirect,      "Dialog 2", 0,                   5,  10,  50,  20, TEXT_CF_LEFT }
  29. };
  30. static const GUI_WIDGET_CREATE_INFO _aDialogCreate3[] = {
  31.   { WINDOW_CreateIndirect,    "Dialog 3", 0,                   0,   0, 260, 100, FRAMEWIN_CF_MOVEABLE },
  32.   { RADIO_CreateIndirect,     "",         GUI_ID_RADIO0,       5,  30,   0,   0, 0, 3},
  33.   { TEXT_CreateIndirect,      "Option 1", GUI_ID_TEXT0,       25,  30,  50,  15, TEXT_CF_LEFT },
  34.   { TEXT_CreateIndirect,      "Option 2", GUI_ID_TEXT1,       25,  50,  50,  15, TEXT_CF_LEFT },
  35.   { TEXT_CreateIndirect,      "Option 3", GUI_ID_TEXT2,       25,  70,  50,  15, TEXT_CF_LEFT },
  36.   { TEXT_CreateIndirect,      "Dialog 3", 0,                   5,  10,  50,  20, TEXT_CF_LEFT }
  37. };
  38. static const GUI_WIDGET_CREATE_INFO _aDialogCreate4[] = {
  39.   { WINDOW_CreateIndirect,    "Dialog 4", 0,                   0,   0, 260, 100, FRAMEWIN_CF_MOVEABLE },
  40.   { MULTIEDIT_CreateIndirect, "Text",     GUI_ID_MULTIEDIT0,   5,  30, 200,  40  },
  41.   { TEXT_CreateIndirect,      "Dialog 4", 0,                   5,  10,  50,  20, TEXT_CF_LEFT }
  42. };
  43. static const GUI_WIDGET_CREATE_INFO _aDialogCreate5[] = {
  44.   { WINDOW_CreateIndirect,    "Dialog 5", 0,                   0,   0, 260, 100, FRAMEWIN_CF_MOVEABLE },
  45.   { SLIDER_CreateIndirect,    "",         GUI_ID_SLIDER0,      5,  30, 200,  40  },
  46.   { TEXT_CreateIndirect,      "Dialog 5", 0,                   5,  10,  50,  20, TEXT_CF_LEFT }
  47. };
  48. static const GUI_WIDGET_CREATE_INFO _aDialogCreate6[] = {
  49.   { WINDOW_CreateIndirect,    "Dialog 6", 0,                   0,   0, 260, 100, FRAMEWIN_CF_MOVEABLE },
  50.   { SCROLLBAR_CreateIndirect, "",         GUI_ID_SCROLLBAR0,   5,  30, 200,  40  },
  51.   { TEXT_CreateIndirect,      "Dialog 6", 0,                   5,  10,  50,  20, TEXT_CF_LEFT }
  52. };
  53. /*********************************************************************
  54. *
  55. *       Static code
  56. *
  57. **********************************************************************
  58. */
  59. /*********************************************************************
  60. *
  61. *       _cbDialog4
  62. */
  63. static void _cbDialog4(WM_MESSAGE * pMsg) {
  64.   WM_HWIN hItem;
  65.   WM_HWIN hDlg;
  66.   hDlg = pMsg->hWin;
  67.   switch (pMsg->MsgId) {
  68.   case WM_INIT_DIALOG:
  69.     hItem = WM_GetDialogItem(hDlg, GUI_ID_MULTIEDIT0);
  70.     MULTIEDIT_SetText(hItem, "MULTIEDIT widget");
  71.     MULTIEDIT_SetInsertMode(hItem, 1);
  72.     break;
  73.   default:
  74.     WM_DefaultProc(pMsg);
  75.   }
  76. }
  77. /*********************************************************************
  78. *
  79. *       _cbBkWindow
  80. *
  81. *   桌面窗口的回调函数,主要是重绘部分
  82. */
  83. static void _cbBkWindow(WM_MESSAGE * pMsg) {
  84.   switch (pMsg->MsgId) {
  85.   case WM_PAINT:
  86.     GUI_SetBkColor(GUI_BLUE);
  87.     GUI_Clear();
  88.     GUI_SetColor(GUI_WHITE);
  89.     GUI_SetFont(&GUI_Font24_ASCII);
  90.     GUI_DispStringHCenterAt("WIDGET_Multipage - Sample", 160, 5);
  91.     break;
  92.   default:
  93.     WM_DefaultProc(pMsg);
  94.   }
  95. }
  96. /*********************************************************************
  97. *
  98. *       Public code
  99. *
  100. **********************************************************************
  101. */
  102. /*********************************************************************
  103. *
  104. *       MainTask
  105. */
  106. void MainTask(void) {
  107.   WM_HWIN hMultiPage;
  108.   WM_HWIN hFrameWin;
  109.   WM_HWIN hDialog;
  110.   //
  111.   // 使能窗口使用内存设备
  112.   //
  113.   WM_SetCreateFlags(WM_CF_MEMDEV);
  114.   GUI_Init();
  115.   /* 设置桌面窗口的回调函数 */
  116.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);
  117.   //
  118.   // 创建框架窗口
  119.   //
  120.   hFrameWin = FRAMEWIN_Create("FrameWindow", NULL, WM_CF_SHOW, 40, 44, 240, 152);
  121.   /* 设置窗口的属性 */
  122.   FRAMEWIN_SetClientColor(hFrameWin, GUI_GREEN);
  123.   FRAMEWIN_SetActive(hFrameWin, 1);
  124.   FRAMEWIN_SetMoveable(hFrameWin, 1);
  125.   //
  126.   // 在框架窗口上创建多页控件
  127.   //
  128.   hMultiPage = MULTIPAGE_CreateEx(7, 6, 220, 120, WM_GetClientWindow(hFrameWin), WM_CF_SHOW, 0, 0);
  129.   GUI_Delay(500);
  130.   //
  131.   // 在多页控件的每页上面创建对话框,创建了对话框后,要通过函数MULTIPAGE_AddPage进行添加。
  132.   //
  133.   hDialog = GUI_CreateDialogBox(_aDialogCreate1, GUI_COUNTOF(_aDialogCreate1), NULL,       WM_UNATTACHED, 0, 0);
  134.   MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 1");
  135.   GUI_Delay(500);
  136.   hDialog = GUI_CreateDialogBox(_aDialogCreate2, GUI_COUNTOF(_aDialogCreate2), NULL,       WM_UNATTACHED, 0, 0);
  137.   MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 2");
  138.   GUI_Delay(500);
  139.   hDialog = GUI_CreateDialogBox(_aDialogCreate3, GUI_COUNTOF(_aDialogCreate3), NULL,       WM_UNATTACHED, 0, 0);
  140.   MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 3");
  141.   GUI_Delay(500);
  142.   hDialog = GUI_CreateDialogBox(_aDialogCreate4, GUI_COUNTOF(_aDialogCreate4), _cbDialog4, WM_UNATTACHED, 0, 0);
  143.   MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 4");
  144.   GUI_Delay(500);
  145.   hDialog = GUI_CreateDialogBox(_aDialogCreate5, GUI_COUNTOF(_aDialogCreate5), NULL,       WM_UNATTACHED, 0, 0);
  146.   MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 5");
  147.   GUI_Delay(500);
  148.   hDialog = GUI_CreateDialogBox(_aDialogCreate6, GUI_COUNTOF(_aDialogCreate6), NULL,       WM_UNATTACHED, 0, 0);
  149.   MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 6");
  150.   GUI_Delay(500);
  151.   //
  152.   // 通过函数MULTIPAGE_SetAlign设置对齐
  153.   //
  154.   MULTIPAGE_SetAlign(hMultiPage, MULTIPAGE_ALIGN_RIGHT);
  155.   GUI_Delay(500);
  156.   MULTIPAGE_SetAlign(hMultiPage, MULTIPAGE_ALIGN_RIGHT | MULTIPAGE_ALIGN_BOTTOM);
  157.   GUI_Delay(500);
  158.   MULTIPAGE_SetAlign(hMultiPage, MULTIPAGE_ALIGN_LEFT | MULTIPAGE_ALIGN_BOTTOM);
  159.   while (1) {
  160.     GUI_Delay(100);
  161.   }
  162. }
复制代码
这个例子给出了多页控件的基本使用方法,如果想使用多页控件的话,这个例子很有参考价值。实际显示效果如下:
51.4.png


51.3 使用官方GUIBulder建立多页控件
    这里用GUIBulder5.22建立一个如下的界面(分辨率480*272):
51.5.png

    多页控件中选项的添加也比较容易,在多页控件上右击鼠标,可以看到如下界面:
51.6.png

    添加后具体每个多页控件选项的名字左下角这里进行设置:
51.7.png

    设置好以后,将生成的代码复制到模拟器或者开发板上面并稍作修改(生成的代码在本期教程配套的例子中),显示效果如下:
51.8.png


51.4 总结
    本期教程主要是跟大家讲解了多页控件的基础知识。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的多页控件API,其它的API大家都可以试试。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 19:57 , Processed in 0.155569 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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