硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第54章 SCROLLBAR-滚动条控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-11 16:40:56 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第54章 SCROLLBAR-滚动条控件

    本期教程讲解STemWin支持的滚动条控件。
    54. 1滚动条控件介绍
    54. 2 官方DIALOG_Scrollbar实例
    54. 3 使用官方GUIBulder建立单选按钮控件
    54. 4 总结

54.1 滚动条控件介绍
    滚动条用于滚动列表框或任何其他类型的窗口。它们可以水平 (如下所示)或垂直创建。
54.1.png

通常,滚动条将附加到现有窗口,例如下图所示的列表框:
54.2.png

设置皮肤后显示效果如下:
54.3.png


54.1.1 滚动条支持的通知代码
    以下事件是滚动条作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:

消息

描述

WM_NOTIFICATION_CLICKED

已单击滚动条。。

WM_NOTIFICATION_RELEASED

已释放滚动条。

WM_NOTIFICATION_SCROLLBAR_ADDED

滚动条刚刚被添加 (附加)至现有窗口。需要通知窗口,以便使其能初始化滚动条。

WM_NOTIFICATION_VALUE_CHANGED

滚动条的值可以通过移动缩略图或按下箭头按钮进行更改


54.1.2 滚动条支持的键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反应:

按键

反应

GUI_KEY_RIGHT

将滚动条的当前值增加1。

GUI_KEY_DOWN

将滚动条的当前值增加1。

GUI_KEY_PGDOWN

将滚动条的当前值增加1页。

GUI_KEY_LEFT

将滚动条的当前值减小1。

GUI_KEY_UP

将滚动条的当前值减小1。

GUI_KEY_PGUP

将滚动条的当前值减小1页。


54.2 官方WIDGET_Scrollbar实例
    官方的这个实例很好的演示了scrollbar的使用,这个例子在模拟器中的位置:
54.4.png
源码如下(程序中进行了详细的注释):
  1. #include "GUI.h"
  2. #include "SCROLLBAR.h"
  3. #include "EDIT.h"
  4. #include <stddef.h>
  5. /*******************************************************************
  6. *
  7. *       defines
  8. *
  9. ********************************************************************
  10. */
  11. /* 制作行3列的方框*/
  12. #define EDIT_MAX_X 10
  13. #define EDIT_MAX_Y 3
  14. /*******************************************************************
  15. *
  16. *       static variables
  17. *
  18. ********************************************************************
  19. */
  20. static EDIT_Handle _aahEdit[EDIT_MAX_Y][EDIT_MAX_X];
  21. static int _x,_y;  /* 注意默认是初始化为的要不就不对了*/
  22. /*******************************************************************
  23. *
  24. *       _cbWindow
  25. *  桌面窗口的回调函数,当接受到滚动条的WM_NOTIFICATION_VALUE_CHANGED消息时,移动所有的编辑框
  26. *  
  27. */
  28. static void _cbWindow(WM_MESSAGE *pMsg) {
  29.   /*结构体WM_SCROLL_STATE的定义如下:
  30. typedef struct {
  31. int NumItems;
  32. int v;
  33. int PageSize;
  34. } WM_SCROLL_STATE;
  35.   */
  36.   WM_SCROLL_STATE ScrollState;
  37.   switch (pMsg->MsgId) {
  38.   case WM_NOTIFY_PARENT:
  39.       /* 接受到的是WM_NOTIFICATION_VALUE_CHANGED消息*/
  40.   if (pMsg->Data.v == WM_NOTIFICATION_VALUE_CHANGED) {
  41.   /* 消息时来自水平的滚动条*/
  42.       if (WM_GetId(pMsg->hWinSrc) == GUI_ID_HSCROLL) {
  43.         WM_GetScrollState(pMsg->hWinSrc, &ScrollState);
  44.         /* 根据当前滚动条的位置,移动编辑框*/
  45. if (_x != ScrollState.v) {
  46.           int x, y;
  47.           for (y = 0; y < EDIT_MAX_Y; y++) {
  48.             for (x = 0; x < EDIT_MAX_X; x++) {
  49.               WM_MoveWindow(_aahEdit[y][x], _x - ScrollState.v, 0);
  50.             }
  51.           }
  52.           _x = ScrollState.v;
  53.         }
  54.       }
  55.     }
  56.     break;
  57.   case WM_PAINT:
  58.     GUI_SetBkColor(GUI_RED);
  59.     GUI_Clear();
  60.     break;
  61.   default:
  62.     WM_DefaultProc(pMsg);
  63.   }
  64. }
  65. /*******************************************************************
  66. *
  67. *       _DemoScrollbarMove
  68. */
  69. static void _DemoScrollbarMove(void) {
  70.   int x, y;
  71.   WM_HWIN hWindow;
  72.   SCROLLBAR_Handle hScroll;
  73.   /*基本设置*/
  74.   GUI_SetBkColor(GUI_BLUE);
  75.   GUI_Clear();
  76.   GUI_SetColor(GUI_WHITE);
  77.   GUI_SetFont(&GUI_Font24_ASCII);
  78.   GUI_SetTextAlign(GUI_TA_HCENTER);
  79.   GUI_DispStringAt("SCROLLBAR_Move - Sample", 160, 5);
  80.   GUI_SetTextAlign(GUI_TA_LEFT);
  81.   GUI_SetColor(0xFFFFFF);
  82.   GUI_SetFont(&GUI_Font8x16);
  83.   /* 创建窗口*/
  84.   hWindow = WM_CreateWindow(50, 90, 220, 79, WM_CF_SHOW, &_cbWindow, 0);
  85.   /* 创建窗口的子控件*/
  86.   hScroll = SCROLLBAR_CreateAttached(hWindow, 0);
  87.   /* 设置滚动条条目的数量*/
  88.   SCROLLBAR_SetNumItems(hScroll, 48 * EDIT_MAX_X);
  89.   /* 设置页尺寸
  90. 页面大小被指定为一页的项目数。如果用户使用键盘或通过在滚动条区域点击鼠
  91. 标向上或向下翻页,则窗口按照为一页指定的项目数向上或向下滚动。
  92.   */
  93.   SCROLLBAR_SetPageSize(hScroll, 220);
  94.   /* 创建编辑区域*/
  95.   for (y = 0; y < EDIT_MAX_Y; y++) {
  96.     for (x = 0; x < EDIT_MAX_X; x++) {
  97. /* 创建编辑框*/
  98.       _aahEdit[y][x] = EDIT_CreateAsChild(x * 48, y * 22, 48, 22,
  99.                                         hWindow, 13, WM_CF_SHOW, 5);
  100.       /* 设置对齐方式和字体*/
  101.       EDIT_SetTextAlign(_aahEdit[y][x], GUI_TA_RIGHT | GUI_TA_VCENTER);
  102.       EDIT_SetFont(_aahEdit[y][x], &GUI_Font8x16);
  103.   /* 启用编辑区的十进制编辑模式给出的数值可以在给定的范围内显示*/
  104.       EDIT_SetDecMode(_aahEdit[y][x], ((y * EDIT_MAX_X) + x) * 100, -99999, +99999, 2, 0);
  105.   }
  106.   }
  107.   while (1) {
  108.     GUI_Exec();
  109.     GUI_Delay(20);
  110.   }
  111.   /* delete window and clear display */
  112.   WM_DeleteWindow(hWindow);
  113.   GUI_Clear();
  114. }
  115. /*******************************************************************
  116. *
  117. *       MainTask
  118. *
  119. *       Demonstates the use of a scrollbar as child of a window
  120. *
  121. ********************************************************************
  122. */
  123. void MainTask(void) {
  124.   GUI_Init();
  125.   while(1) {
  126.     _DemoScrollbarMove();
  127.   }
  128. }
复制代码
实际显示效果如下:
54.5.png

54.3 使用官方GUIBulder建立单选按钮控件
    这里用GUIBulder5.22建立一个如下的界面(分辨率480*272):
54.6.png

框架窗口最右侧和最下面依附的两个滚动条是通过在框架窗口上面右击鼠标进行添加:
54.7.png

其它的两个水平和垂直滚动条直接添加即可,添加的时候默认是水平的滚动条,垂直的滚动条需要通过将水平滚动条按照如下方法进行设置(鼠标左键点击滚动条选中后,右击鼠标进行选择)
54.8.png

将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中):
54.9.png


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-14 21:47 , Processed in 0.160502 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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