硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第53章 RADIO-单选按钮控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-11 11:48:34 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第53章 RADIO-单选按钮控件

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

53.1 进度条控件介绍
    如同复选框一样,单选按钮也可用来选择选项。打开或选择单选按钮时,将出现圆点。与复选框的差别是,用户一次只能选择一个单选按钮。选择一个按钮时,控件中的其他按钮将关闭 (如右图所示)。一个单选按钮控件可能包含任意数量的按钮, 这些按钮始终处于垂直排列状态。下表显示的是RADIO按钮的默认外观:
53.1.png

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


53.1.1 单选按钮支持的通知代码
    以下事件是单选按钮控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:

消息

描述

WM_NOTIFICATION_CLICKED

已被点击。

WM_NOTIFICATION_RELEASED

已被释放。

WM_NOTIFICATION_MOVED_OUT

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

WM_NOTIFICATION_VALUE_CHANGED

单选按钮的值 (内容)已更改。


53.1.2 单选按钮支持的键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反

按键

反应

GUI_KEY_RIGHT

选定范围增加1。

GUI_KEY_DOWN

选定范围增加1。

GUI_KEY_LEFT

选定范围减小1。

GUI_KEY_UP

选定范围减小1。


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

源码如下(程序中进行了详细的注释):
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"
  4. /*********************************************************************
  5. *
  6. *       Dialog resource
  7. *    对话框资源表
  8. */
  9. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  10.   { FRAMEWIN_CreateIndirect, "Radio button sample", 0,        30,  70, 260, 100, FRAMEWIN_CF_MOVEABLE },
  11.   { RADIO_CreateIndirect,     NULL,           GUI_ID_RADIO0,   5,  10,   0,   0,   0,  3 },
  12.   { TEXT_CreateIndirect,     "Suspend",       GUI_ID_TEXT0,   25,  10,  70,  20, TEXT_CF_LEFT },
  13.   { TEXT_CreateIndirect,     "Shut down",     GUI_ID_TEXT1,   25,  30,  70,  20, TEXT_CF_LEFT },
  14.   { TEXT_CreateIndirect,     "Restart after", GUI_ID_TEXT2,   25,  50,  70,  20, TEXT_CF_LEFT },
  15.   { TEXT_CreateIndirect,     "seconds",       GUI_ID_TEXT3,  130,  50,  70,  20, TEXT_CF_LEFT },
  16.   { EDIT_CreateIndirect,     "200",           GUI_ID_EDIT0,   95,  47,  30,  19, 0, 3},
  17.   { BUTTON_CreateIndirect,   "OK",            GUI_ID_OK,     180,  10,  60,  20 },
  18.   { BUTTON_CreateIndirect,   "Cancel",        GUI_ID_CANCEL, 180,  40,  60,  20 }
  19. };
  20. /*********************************************************************
  21. *
  22. *       _cbBkWindow
  23. *     桌面窗口的回调函数
  24. */
  25. static void _cbBkWindow(WM_MESSAGE* pMsg) {
  26.   switch (pMsg->MsgId) {
  27.   case WM_PAINT:
  28.     GUI_SetBkColor(GUI_RED);
  29.     GUI_Clear();
  30.     GUI_SetColor(GUI_WHITE);
  31.     GUI_SetFont(&GUI_Font24_ASCII);
  32.     GUI_DispStringHCenterAt("DIALOG_Radio - Sample", 160, 5);
  33.     break;
  34.   default:
  35.     WM_DefaultProc(pMsg);
  36.   }
  37. }
  38. /*********************************************************************
  39. *
  40. *       _cbCallback
  41. *     对话框的回调函数
  42. */
  43. static void _cbCallback(WM_MESSAGE * pMsg) {
  44.   WM_HWIN hDlg;
  45.   WM_HWIN hItem;
  46.   int     Sel;
  47.   int     NCode;
  48.   int     Id;
  49.   GUI_PID_STATE * pState;
  50.   hDlg = pMsg->hWin;
  51.   switch (pMsg->MsgId) {
  52.     case WM_INIT_DIALOG:
  53.       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);
  54.       EDIT_SetDecMode(hItem, 30,   0, 999, 0, 0);    // 选项编辑框的10进制模式
  55.       WM_DisableWindow(hItem);
  56.       break;
  57.     case WM_KEY:
  58.       switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
  59.         case GUI_KEY_ESCAPE:
  60.           GUI_EndDialog(hDlg, 1);
  61.           break;
  62.         case GUI_KEY_ENTER:
  63.           GUI_EndDialog(hDlg, 0);
  64.           break;
  65.       }
  66.       break;
  67. /* 通过WM_TOUCH_CHILD消息的主要功能是:当点击单选按钮边上的文本控件时,
  68.    也可以实现单选按钮控件的选择
  69.   */  
  70.     case WM_TOUCH_CHILD:
  71.       Id = WM_GetId(pMsg->hWinSrc);      
  72.       switch (Id) {
  73.         case GUI_ID_TEXT0:
  74.         case GUI_ID_TEXT1:
  75.         case GUI_ID_TEXT2:
  76.           pState = (GUI_PID_STATE *)((WM_MESSAGE *)pMsg->Data.p)->Data.p;
  77.           if (pState) {
  78.             if (pState->Pressed) {
  79.               WM_HWIN hRadio = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);
  80.               RADIO_SetValue(hRadio, Id - GUI_ID_TEXT0);   
  81.             }
  82.           }
  83.           break;
  84.       }
  85.       break;
  86.     case WM_NOTIFY_PARENT:
  87.       Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget
  88.       NCode = pMsg->Data.v;                 // Notification code
  89.       switch (NCode) {
  90.         case WM_NOTIFICATION_RELEASED:      // React only if released
  91.           switch (Id) {
  92.             case GUI_ID_OK:
  93.               GUI_EndDialog(hDlg, 0);
  94.               break;
  95.             case GUI_ID_CANCEL:
  96.               GUI_EndDialog(hDlg, 1);
  97.               break;
  98.           }
  99.           break;
  100. /* 当选择第三个单选按钮时,将使能编辑框GUI_ID_EDIT0 */
  101.         case WM_NOTIFICATION_VALUE_CHANGED:
  102.           hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);
  103.           Sel   = RADIO_GetValue(hItem);
  104.           hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);
  105.           WM_SetEnableState(hItem, Sel == 2);      
  106.           break;
  107.       }
  108.       break;
  109.     default:
  110.       WM_DefaultProc(pMsg);
  111.   }
  112. }
  113. /*********************************************************************
  114. *
  115. *       MainTask
  116. */
  117. void MainTask(void) {
  118.   GUI_Init();
  119.   WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
  120.   WM_SetCreateFlags(WM_CF_MEMDEV);  // Use memory devices on all windows to avoid flicker
  121.   while (1) {
  122. /* 创建阻塞式对话框 */
  123.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  124.     GUI_Delay(1000);
  125.   }
  126. }
复制代码
实际现象效果如下:
53.4.png


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

    鼠标放在单选按钮控件上面右击可以设置单选按钮:
53.6.png

    具体每个选项的名字在右下角进行设置:
53.7.png

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


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 13:38 , Processed in 0.197088 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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